专业编程培训机构——完成蜕变以后轻松拿高薪
电话+V: 152079-09430 ,欢迎咨询java调用数据库truncate,[python实用课程],[C++单片机原理],[C#网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]
一、java关系数据库基础的,数据库表数据删除两种语法的区别是什么_百度知...
数据库删除语句的分别介绍:
Delete:用于删除表中的行(注:可以删除某一行;也可以在不删除表的情况下(即意味着表的结构、属性、索引完整)删除所有行)
语法:删除某一行:Delete
From
表名称
Where
列名称=值
删除所有行:
Delete
From
表名称
或
Delete
*
From
表名称
Drop:用于删除表(注:将表的结构、属性、索引也会被删除。)
语法:Drop
Table
表名称
Truncate:用于删除表内的数据(注:仅删除表内的数据,不删除表本身,相当于Delete语句不写Where子句一样)
语法:Truncate
Table
表名称
数据库中删除语句的相同点和不同点的比较:
相同点:
1.truncate和不带where子句的delete,以及drop都能删除表内的数据
2.truncate和delete只删除表数据保留表结构
不同点:
1.
truncate
table
tablename
删除表内容释放表空间保留表结构(即:只删除表内的数据,不删除表本身。相当于Delete语句不写where子句一样),不使用事务处理即和事务无关
truncate
语句缺省情况下将空间释放到
minextents个
extent,
除非使用reuse
storage;truncate
会将高水线复位(回到最开始)。
2.
delete
table
tablename
[where子句]
delete属于数据操作语言(DML),不能自动提交事务,需commit提交
这个操作会放到
rollback
segement
中,事务提交之后才生效;
如果有相应的
trigger,执行的时候将被触发。
delete
语句不影响表所占用的
extent,高水线(high
watermark)保持原位置不动
3.
drop
table
tablename
drop属于数据定义语言(DDL)可以自动提交事务;
drop
语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index)【删除表数据同时删除表结构】;
依赖于该表的存储过程/函数将保留,但是变为
invalid
状态。
drop
语句将表所占用的空间全部释放。
删除数据的速度,一般来说:
drop>
truncate
>
delete
使用场合:
当你不再需要该表时,
用
drop;
当你仍要保留该表,但要删除所有记录时,
用
truncate;
当你要删除部分记录时(always
with
a
where
clause),
用
delete.
注意:
二、删除数据库的命令是
1、drop(删除表):删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
2、truncate(清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构)。与drop不同的是,只是清空表数据而已。
注意:truncate不能删除行数据,要删就要把表清空。
3、delete(删除表中的数据):delete语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
truncate与不带where的delete:只删除数据,而不删除表的结构(定义)
4、truncatetable删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用delete。如果要删除表定义及其数据,请使用 droptable语句。
5、对于由foreignkey约束引用的表,不能使用truncatetable,而应使用不带where子句的delete语句。由于truncatetable记录在日志中,所以它不能激活触发器。
6、执行速度,一般来说:drop>truncate>delete。
7、delete语句是数据库操作语言(dml),这个操作会放到rollbacksegement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发。
扩展资料
例子:
1、查看数据库
2、切换数据库
3、查看数据库中已创建的表
Java21虚拟线程的陷阱:我们在TPC-CforPostgreSQL中遭遇死锁
InfoQ2024-01-2414:31发布于北京InfoQ官方账号+关注作者|EvgeniyIvanov\t\t\t译者|平川\t\t\t策划|Tina\t本文最初发布于YDB.TECH。Java21哲学家就餐问题在上一篇关于TPC-C的文章中,我们讨论了Benchbase项目中TPC-C原始实现的一些缺点(尽管如此,它还是很棒)。其中一个缺点是因生成的物理线程太多所导致的并发性限制,我们通过切换到Java21虚拟线程解决了这个问题。后来我们发现,像往常一样,天下没有免费的午餐。这篇文章中展示了一个案例研究,我们在TPC-CforPostgreSQL中遇到了虚拟线程死锁。这篇文章对正在考虑切换到虚拟线程的Java开发人员可能会有所帮助。我们着重强调了虚拟线程潜在的一个重要问题:死锁可能是不可预测的,因为它们可能发生在你所使用的库的深处。幸运的是,调试很简单,我们将探讨如何在发生死锁时找到它们。\t\t我们为什么要在YDB的博客上讨论PostgreSQL\tPostgreSQL是一个开源数据库管理系统,以高性能、丰富的特性集、先进的SQL遵从性以及充满活力的支持性社区而闻名。如果不考虑水平可扩展性和容错性,那么它是很棒的。最终,你会选择基于PostgreSQL的第三方解决方案,比如Citus,它实现了PostgreSQL分片。养一只大象可能很有趣,但管理一群大象是一项挑战,特别是如果你希望维护多个一致的副本,并使用序列化隔离执行分布式事务。与此相反,YDB一开始设计时就是一个分布式数据库管理系统。YDB将分布式事务作为一等公民,默认即在序列化隔离级别上运行。现在,我们正在积极地兼容PostgreSQL,因为我们看到,PostgreSQL用户对现有应用程序的自动扩展和容错性有着强烈的需求。这就是我们维护TPC-CforPostgreSQL的原因(我们希望很快将其合并到上游Benchbase项目中)。\t\t背景和动机简述\t首先,我们回顾下一些基本概念:并发、并行执行以及异步与同步请求。并发意味着任务在同一时间以并行或顺序的方式执行。例如,你可能有两个活动:在编辑器中编写代码和与同事在Slack上聊天。你可以同时执行这两项任务,但不是并行执行。或者你可以带着你的狗散步,同时和朋友打电话。同样,你可以同时执行这两项任务,但这一次是并行执行。现在,考虑一下应用程序向数据库发出请求的情况。请求通过网络发送,数据库提供服务,将应答发送回应用程序。注意,网络往返可能是请求中成本最高的部分,可能需要几毫秒。在等待回复时,你可以在应用程序端做些什么呢?请求可能是同步的,也就是说,它将阻塞调用线程。这种方法的代码很简单:第1行发起有请求;第2行处理响应:
请求可能是异步的。线程不会阻塞而是继续执行,而请求是并行处理的:
CompletableFuture<String>userNameFuture=get_username_from_db(userId);//注意,这是一种回调,它不会在"这里"执行,//甚至在某些时候,它将与线程并行执行。//在现实场景中,你将不得不使用互斥。userNameFuture.thenAccept(userName->{System.out.println("Hello,%s!",userName);});execute_something_else();userNameFuture.get();//等待请求完成在每一种情况下都有两个并发任务:线程正在等待数据库的回复,而数据库正在处理请求。同步代码的编写非常简单,而且很容易阅读。但是,如果需要同时向数据库发出数千个请求,该怎么办呢?你必须为每个请求生成一个线程。在Linux中生成线程的成本很低,但生成的线程太多会令人非常担忧:
每个线程都需要一个堆栈。你分配的内存不能小于系统页面的大小,而页面的大小通常约为4KiB,除非你使用大页,其默认大小为2MiB。
Linux有一个调度器。如果有重置按钮的话,你可以尝试生成10万个准备执行的线程。
这就是在Java21之前没有办法编写高并发性同步代码的原因:无法生成许多线程。Go语言彻底改变了这一点:goroutine提供了非常轻量级的并发,因此你可以高效地编写同步代码。建议你看下DmitryVyukov做的这个关于Go调度器的演讲。Java21引入了虚拟线程,它在很多方面和goroutine类似。请记住,goroutine和虚拟线程并不是一项新发明,而是用户级线程这一古老概念的转世。现在就可以理解BenchbaseTPC-C原始实现中数据库同步请求的问题了。要使数据库能够处理高负载,就必须运行许多TPC-C仓库,生成许多线程。在使用物理线程时,我们无法运行超过3万个终端线程,而在使用虚拟线程时,我们可以轻松拥有数十万个终端虚拟线程。\t\t死锁很容易\t假设你已经有了多线程Java代码。添加一个使用虚拟线程的选项非常简单,而且非常有益。只要简单地使用新的虚拟线程构建器替换标准线程创建代码,你的应用程序就可以处理数千个并发任务了,而且不会产生与物理线程相关的开销。下面这个例子来自我们的TPC-C实现:if(useRealThreads){thread=newThread(worker);}else{thread=Thread.ofVirtual().unstarted(worker);}这样就行了。现在,你在使用虚拟线程了。在后台,Java虚拟机会创建一个线程池carrierthreads,它会执行virtualthreads。这种转换看起来很完美,直到你的应用程序意外停止。我们的PostgreSQLTPC-C实现利用了c3p0连接池。TPC-C标准规定,每个终端都必须有自己的连接。然而,在许多实际的场景中,这是不现实的。因此,我们包含了一个选项用于限制数据库连接的数量。终端的数量远远大于可用连接的数量。因此,部分终端必须等待会话变为可用,即由另一个终端释放。当我们初次运行TPC-C时,应用程序意外停止了。幸运的是,调试很简单:使用jstack-p<PID>捕获线程堆栈。
使用jcmd<PID>Thread.dump_to_file-format=textjcmd.dump.1创建更详细的当前状态转储,其中包括有关carrierthreads和virtualthreads的信息。
经过研究,我们发现一些等待会话的虚拟线程锚定了它们的载体线程。下面是一个出现这种情况的虚拟线程的堆栈:#7284"TPCCWorker<7185>"virtualjava.base/java.lang.Object.wait0(NativeMethod)java.base/java.lang.Object.wait(Object.java:366)com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1503)com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685)com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)com.oltpbenchmark.api.BenchmarkModule.makeConnection(BenchmarkModule.java:108)com.oltpbenchmark.api.Worker.doWork(Worker.java:428)com.oltpbenchmark.api.Worker.run(Worker.java:304)java.base/java.lang.VirtualThread.run(VirtualThread.java:309)下面是其载体线程的堆栈:"ForkJoinPool-1-worker-254"#50326[32859]daemonprio=5os_prio=0cpu=12.39mselapsed=489.99stid=0x00007f3810003140[0x00007f37abafe000]Carryingvirtualthread#7284atjdk.internal.vm.Continuation.run(java.base@21.0.1/Continuation.java:251)atjava.lang.VirtualThread.runContinuation(java.base@21.0.1/VirtualThread.java:221)atjava.lang.VirtualThread$$Lambda/0x00007f3c2424e410.run(java.base@21.0.1/UnknownSource)atjava.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(java.base@21.0.1/ForkJoinTask.java:1423)atjava.util.concurrent.ForkJoinTask.doExec(java.base@21.0.1/ForkJoinTask.java:387)atjava.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(java.base@21.0.1/ForkJoinPool.java:1312)atjava.util.concurrent.ForkJoinPool.scan(java.base@21.0.1/ForkJoinPool.java:1843)atjava.util.concurrent.ForkJoinPool.runWorker(java.base@21.0.1/ForkJoinPool.java:1808)atjava.util.concurrent.ForkJoinWorkerThread.run(java.base@21.0.1/ForkJoinWorkerThread.java:188)如你所见,线程在Object.wait()(一个与synchronized搭配使用的方法)中夯住了。这将导致载体线程被锚定,也就是说它不会被释放用于执行其他虚拟线程。同时,会话持有者在等待I/O操作时释放了它们的载体线程:java.base/java.lang.VirtualThread.park(VirtualThread.java:582)java.base/java.lang.System$2.parkVirtualThread(System.java:2639)java.base/jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:54)java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:369)java.base/sun.nio.ch.Poller.pollIndirect(Poller.java:139)java.base/sun.nio.ch.Poller.poll(Poller.java:102)java.base/sun.nio.ch.Poller.poll(Poller.java:87)java.base/sun.nio.ch.NioSocketImpl.park(NioSocketImpl.java:175)java.base/sun.nio.ch.NioSocketImpl.park(NioSocketImpl.java:201)java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346)java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796)java.base/java.net.Socket$SocketInputStream.read(Socket.java:1099)java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:489)java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:483)java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1461)java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1066)org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:161)org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:128)org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:113)org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73)org.postgresql.core.PGStream.receiveChar(PGStream.java:465)org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2155)org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:574)org.postgresql.jdbc.PgStatement.internalExecuteBatch(PgStatement.java:896)org.postgresql.jdbc.PgStatement.executeBatch(PgStatement.java:919)org.postgresql.jdbc.PgPreparedStatement.executeBatch(PgPreparedStatement.java:1685)com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:2544)com.oltpbenchmark.benchmarks.tpcc.procedures.NewOrder.newOrderTransaction(NewOrder.java:214)com.oltpbenchmark.benchmarks.tpcc.procedures.NewOrder.run(NewOrder.java:147)com.oltpbenchmark.benchmarks.tpcc.TPCCWorker.executeWork(TPCCWorker.java:66)com.oltpbenchmark.api.Worker.doWork(Worker.java:442)com.oltpbenchmark.api.Worker.run(Worker.java:304)java.base/java.lang.VirtualThread.run(VirtualThread.java:309)这就导致了以下情况:所有的载体线程都被会话等待者锚定,也就是说没有载体线程是可用的。
持有会话的虚拟线程无法完成任务并释放会话。
死锁很容易!JEP444指出:在两种情况下,虚拟线程在阻塞操作期间无法卸载,因为它被锚定在它的载体线程上:当它执行同步块或方法中的代码时,或者当它执行本机方法或外部函数时。\t\t小结\t这是弗雷德·布鲁克斯所著《人月神话》一书的封面。这本书的封面艺术版权属于出版商Addison-Wesley或封面艺术家。尽管软件开发已经发展了几十年,但似乎仍然没有什么银弹。不过,Java21虚拟线程是一个了不起的特性,如果使用得当,可以带来显著的好处:即使并发很高,也很容易编写出高效的异步代码。https://blog.ydb.tech/how-we-switched-to-java-21-virtual-threads-and-got-deadlock-in-tpc-c-for-postgresql-cca2fe08d70b声明:本文为InfoQ翻译,未经许可禁止转载。
【FUTURE PROGRAMMING COURSE】尊享对接老板
电话+V: 152079-09430
机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。