如果表为空,则插入多条记录
Posted
技术标签:
【中文标题】如果表为空,则插入多条记录【英文标题】:Insert multiple records if table is empty 【发布时间】:2020-08-29 17:46:16 【问题描述】:我有一个场景,如果表为空,我必须插入多条记录。每次我运行我的服务器时,我的 sql 脚本都会运行。我不使用 H2 数据库,因此我可以插入重复键。我使用 myBatis。我希望只有在表为空时才插入查询。
我的插入查询如下:
LOCK TABLES `t002_seat_mst` WRITE;
INSERT INTO `t002_seat_mst` VALUES (2020,1,1,0,0,1,0,'228A'),(2021,1,2,0,0,1,0,'229A'),
(2022,1,3,0,0,1,0,'231A'),(2023,1,4,0,0,1,0,'233A'),(2024,1,5,0,0,1,0,'235A'),
(2025,1,6,0,0,1,0,'237A'),(2026,1,7,0,0,1,0,'239A'),(2027,1,8,0,0,1,0,'240A'),
(2028,1,9,0,0,1,0,'242A'),(2029,1,10,0,0,1,0,'244A'),(2030,1,11,0,0,1,0,'246A');
UNLOCK TABLES;
我怎样才能做到这一点?
【问题讨论】:
"...每次我运行我的服务器时,我的 sql 脚本都会运行..." -- 你的意思是什么?当你重新启动盒子时,引擎? 这意味着,每当我运行我的应用程序时,脚本就会被执行。 【参考方案1】:测试
LOCK TABLES `t002_seat_mst` AS t1 WRITE, `t002_seat_mst` AS t2 READ;
INSERT INTO t002_seat_mst AS t1
SELECT *
FROM ( SELECT 2020 a,1 b,1 c,0 d,0 e,1 f,0 g,'228A' h UNION ALL
SELECT 2021,1,2,0,0,1,0,'229A' UNION ALL
SELECT 2022,1,3,0,0,1,0,'231A' UNION ALL
SELECT 2023,1,4,0,0,1,0,'233A' UNION ALL
SELECT 2024,1,5,0,0,1,0,'235A' UNION ALL
SELECT 2025,1,6,0,0,1,0,'237A' UNION ALL
SELECT 2026,1,7,0,0,1,0,'239A' UNION ALL
SELECT 2027,1,8,0,0,1,0,'240A' UNION ALL
SELECT 2028,1,9,0,0,1,0,'242A' UNION ALL
SELECT 2029,1,10,0,0,1,0,'244A' UNION ALL
SELECT 2030,1,11,0,0,1,0,'246A' ) data
WHERE NOT EXISTS ( SELECT NULL
FROM t002_seat_mst AS t2 );
UNLOCK TABLES;
【讨论】:
很高兴您将NULL
与EXISTS
结合在一起。 +1
嗨,Akina,我在锁定和解锁表下有这个查询。这给出了一个错误说明Table 't002_seat_mst' was not locked with LOCK TABLES
@Subham 这是一个错误说明 你是否在使用 LOCK TABLES 语句的某些代码块(过程、函数、事件等)中使用我的查询?
是的@Akina。我正在使用schema.sql
文件中的查询,其中包含锁定和解锁表语句。我已经编辑了这个问题。请看一看。
@Subham 当您使用 LOCK-UNLOCK 块时,您必须在 LOCK TABLE 语句中提及所有表副本,这些副本在此块中以正确的锁类型访问。如果某些查询使用多个表副本,则必须为每个副本分配唯一别名并锁定每个别名。因此,为t002_seat_mst
表的 2 个副本(在 UPDATE 和子查询的 FROM 中)提供 2 个不同的别名,并为它们使用适当的 LOCK 类型。这在documentation(第二个例子)中有很好的描述。代码已更新。以上是关于如果表为空,则插入多条记录的主要内容,如果未能解决你的问题,请参考以下文章
如果表为空,则 CodeIgniter result_array() 出现布尔错误
SQL - 内连接 2 个表,但如果 1 个表为空,则返回所有表