提交 d2b505e3 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Add support of CONTINUE | RESTART IDENTITY to TRUNCATE TABLE

上级 fe655e2b
......@@ -974,7 +974,7 @@ DROP VIEW TEST_VIEW
"
"Commands (DDL)","TRUNCATE TABLE","
TRUNCATE TABLE tableName
TRUNCATE TABLE tableName [ [ CONTINUE | RESTART ] IDENTITY ]
","
Removes all rows from a table.
Unlike DELETE FROM without where clause, this command can not be rolled back.
......@@ -982,6 +982,7 @@ This command is faster than DELETE without where clause.
Only regular data tables without foreign key constraints can be truncated
(except if referential integrity is disabled for this database or for this table).
Linked tables can't be truncated.
If RESTART IDENTITY is specified next values for auto-incremented columns are restarted.
This command commits an open transaction in this connection.
","
......
......@@ -1578,8 +1578,19 @@ public class Parser {
private Prepared parseTruncate() {
read("TABLE");
Table table = readTableOrView();
boolean restart;
if (readIf("CONTINUE")) {
read("IDENTITY");
restart = false;
} else if (readIf("RESTART")) {
read("IDENTITY");
restart = true;
} else {
restart = false;
}
TruncateTable command = new TruncateTable(session);
command.setTable(table);
command.setRestart(restart);
return command;
}
......
......@@ -10,6 +10,8 @@ import org.h2.command.CommandInterface;
import org.h2.engine.Right;
import org.h2.engine.Session;
import org.h2.message.DbException;
import org.h2.schema.Sequence;
import org.h2.table.Column;
import org.h2.table.Table;
/**
......@@ -20,6 +22,8 @@ public class TruncateTable extends DefineCommand {
private Table table;
private boolean restart;
public TruncateTable(Session session) {
super(session);
}
......@@ -28,6 +32,10 @@ public class TruncateTable extends DefineCommand {
this.table = table;
}
public void setRestart(boolean restart) {
this.restart = restart;
}
@Override
public int update() {
session.commit(true);
......@@ -37,6 +45,18 @@ public class TruncateTable extends DefineCommand {
session.getUser().checkRight(table, Right.DELETE);
table.lock(session, true, true);
table.truncate(session);
if (restart) {
for (Column column : table.getColumns()) {
Sequence sequence = column.getSequence();
if (sequence != null) {
long min = sequence.getMinValue();
if (min != sequence.getCurrentValue()) {
sequence.modify(min, null, null, null);
session.getDatabase().updateMeta(session, sequence);
}
}
}
}
return 0;
}
......
......@@ -55,3 +55,71 @@ DROP TABLE CHILD;
DROP TABLE PARENT;
> ok
CREATE SEQUENCE SEQ2;
> ok
CREATE SEQUENCE SEQ3;
> ok
CREATE TABLE TEST(
ID1 BIGINT AUTO_INCREMENT NOT NULL,
ID2 BIGINT NOT NULL DEFAULT NEXT VALUE FOR SEQ2 NULL_TO_DEFAULT SEQUENCE SEQ2,
ID3 BIGINT NOT NULL DEFAULT NEXT VALUE FOR SEQ3 NULL_TO_DEFAULT,
VALUE INT NOT NULL);
> ok
INSERT INTO TEST(VALUE) VALUES (1), (2);
> update count: 2
SELECT * FROM TEST ORDER BY VALUE;
> ID1 ID2 ID3 VALUE
> --- --- --- -----
> 1 1 1 1
> 2 2 2 2
> rows (ordered): 2
TRUNCATE TABLE TEST;
> ok
INSERT INTO TEST(VALUE) VALUES (1), (2);
> update count: 2
SELECT * FROM TEST ORDER BY VALUE;
> ID1 ID2 ID3 VALUE
> --- --- --- -----
> 3 3 3 1
> 4 4 4 2
> rows (ordered): 2
TRUNCATE TABLE TEST CONTINUE IDENTITY;
> ok
INSERT INTO TEST(VALUE) VALUES (1), (2);
> update count: 2
SELECT * FROM TEST ORDER BY VALUE;
> ID1 ID2 ID3 VALUE
> --- --- --- -----
> 5 5 5 1
> 6 6 6 2
> rows (ordered): 2
TRUNCATE TABLE TEST RESTART IDENTITY;
> ok
INSERT INTO TEST(VALUE) VALUES (1), (2);
> update count: 2
SELECT * FROM TEST ORDER BY VALUE;
> ID1 ID2 ID3 VALUE
> --- --- --- -----
> 1 1 7 1
> 2 2 8 2
> rows (ordered): 2
DROP TABLE TEST;
> ok
DROP SEQUENCE SEQ3;
> ok
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论