package my.test.command.dml;
import my.test.TestBase;
public class MergeTest extends TestBase {
public static void main(String[] args) throws Exception {
new MergeTest().start();
}
@Override
public void init() throws Exception {
//prop.setProperty("TRACE_LEVEL_FILE", "10");
//prop.setProperty("TRACE_LEVEL_SYSTEM_OUT", "20");
}
@Override
public void startInternal() throws Exception {
stmt.executeUpdate("DROP TABLE IF EXISTS MergeTest");
//如果id是primary key,那么在MERGE语句中KEY子句更省,默认用primary key
//stmt.executeUpdate("CREATE TABLE IF NOT EXISTS MergeTest(id int not null primary key, name varchar(500) not null)");
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS MergeTest(id int, name varchar(500) as '123')");
stmt.executeUpdate("DROP TABLE IF EXISTS tmpSelectTest");
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS tmpSelectTest(id int, name varchar(500))");
stmt.executeUpdate("INSERT INTO tmpSelectTest VALUES(DEFAULT, DEFAULT),(10, 'a'),(20, 'b')");
//从另一表查数据,然后插入此表
sql = "MERGE INTO MergeTest KEY(id) (SELECT * FROM tmpSelectTest)";
stmt.executeUpdate(sql);
sql = "MERGE INTO MergeTest KEY(id) VALUES()"; //这里会抛异常,但是异常信息很怪,算是H2的一个小bug
try {
stmt.executeUpdate(sql);
} catch (Exception e) {
//Syntax error in SQL statement "UPDATE PUBLIC.MERGETEST SET WHERE[*] ID=?"; expected "identifier";
//SQL statement:UPDATE PUBLIC.MERGETEST SET WHERE ID=? [42001-172]
System.out.println(e.getMessage());
}
//这种语法可查入多条记录
//30 null
//10 a
//20 b
sql = "MERGE INTO MergeTest KEY(id) VALUES(30, DEFAULT),(10, 'a'),(20, 'b')";
stmt.executeUpdate(sql);
try {
sql = "MERGE INTO MergeTest KEY(id) VALUES(DEFAULT, DEFAULT),(10, 'a'),(20, 'b')";
stmt.executeUpdate(sql);
} catch (Exception e) {
//org.h2.jdbc.JdbcSQLException: Column "ID" contains null values;
System.out.println(e.getMessage());
}
//列必须一样多,否则:org.h2.jdbc.JdbcSQLException: Column count does not match;
sql = "MERGE INTO MergeTest(name) KEY(id) (SELECT * FROM tmpSelectTest)";
try {
stmt.executeUpdate(sql);
} catch (Exception e) {
System.out.println(e.getMessage());
}
//key字段必须出现在VALUES中
sql = "MERGE INTO MergeTest(name) KEY(id) VALUES('abc')";
try {
stmt.executeUpdate(sql);
} catch (Exception e) {
//Column "ID" contains null values;
System.out.println(e.getMessage());
}
sql = "MERGE INTO MergeTest(name, id) KEY(id) VALUES('abc', 10)";
stmt.executeUpdate(sql);
ps = conn.prepareStatement("MERGE INTO MergeTest(id, name) KEY(id) VALUES(?, ?)");
ps.setInt(1, 30);
ps.setString(2, "c");
ps.executeUpdate();
sql = "EXPLAIN MERGE INTO MergeTest(id, name) KEY(id) SELECT * FROM tmpSelectTest";
executeQuery();
sql = "select id,name from MergeTest";
executeQuery();
}
}