我必须批量插入许多具有关联记录(has_many表(的记录。 所以我的策略是这样的:
生成指定连续 ID(主键(的原始 SQL 查询,以便可以使用这些 ID 作为外键值生成关联的记录。 但是我需要防止其他并发连接创建一个新记录,其 id 在我需要用于批量查询的范围内。 如何为批量插入保留一系列 ID? 我尝试使用alter table tablename auto_increment = x
但不起作用。 另外,我尝试使用此查询创建假记录:
LOCK TABLES tablename WRITE
# get last id (for example 100)
INSERT INTO tablename (SELECT 201 AS id, name FROM tablename WHERE id = 100)
UNLOCK TABLES
但这不起作用,因为我tablename was not locked with LOCK TABLES
收到错误.
有什么想法可以解决这个问题吗?
我希望我解释了自己:D
示意性:
INSERT INTO main (fields except ID)
VALUES (literal values for fields);
INSERT INTO slave (main_id, other fields except ID)
SELECT id, (literal values for other fields)
FROM main
WHERE (fields from main except ID) = (literal values for main fields);
对于批量插入,您必须使用一个中间表,该表接受主表和从属数据,插入后将数据复制到单独的表中,并分配适当的引用值。
-- working tables CREATE TABLE main (id SERIAL PRIMARY KEY, main_val INT); CREATE TABLE slave (id SERIAL PRIMARY KEY, slave_val INT, id_main BIGINT UNSIGNED, FOREIGN KEY (id_main) REFERENCES main(id));
-- table for bulk insert CREATE TABLE for_bulk_insert ( main_val INT, slave_val INT ); -- data for bulk insert, in practice it is loaded using LOAD DATA INFILE INSERT INTO for_bulk_insert VALUES (11,111), (22,222), (33,333);
-- insert data into main table INSERT INTO main (main_val) SELECT main_val FROM for_bulk_insert;
-- insert data into slave table with referenced values from main table INSERT INTO slave (slave_val, id_main) SELECT for_bulk_insert.slave_val, main.id FROM for_bulk_insert JOIN main ON for_bulk_insert.main_val = main.main_val;
-- check the result SELECT * FROM main; SELECT * FROM slave;
ID | main_val -: |-------: 1 | 11 2 | 22 3 | 33 身份证 |slave_val |id_main -: |--------: |------: 1 | 111 | 1 2 | 222 | 2 3 | 333 | 3
db<>在这里小提琴
当然,插入到 main 中的数据数组(在所示示例中它是一个字段main_val
(在表上必须是唯一的。