如何在 MySQL 表中保留 ID 范围



我必须批量插入许多具有关联记录(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(在表上必须是唯一的。

最新更新