(我的)SQL:在“INSERT INTO ... SELECT”中获取新的 id

发布于 2024-11-02 13:31:08 字数 727 浏览 7 评论 0原文

我必须将从另一个表中选择的记录插入到一​​个表中,然后使用为后者生成的 id 更新前一个表。我该怎么做呢?

例如

input_table:

input_table:  code  new_id
               aa    NULL
               bb    NULL


output_table:  id(auto_increment)  code
                ...                ... 

SQL:

INSERT INTO output_table (code) SELECT code FROM input_table;

UPDATE input_table "WITH THE NEW IDS"

结果:

input_table:   code  new_id
                aa    100
                bb    101

output_table:   id   code
                ...  ...
                100  aa
                101  bb

由于多种原因,我不能依赖 output_tablecode 的唯一性。

有什么提示吗?

I have to insert into one table the records selected from another table and (then) update the former table with the generated id for the latter. How can I do it?

E.g.

input_table:

input_table:  code  new_id
               aa    NULL
               bb    NULL


output_table:  id(auto_increment)  code
                ...                ... 

SQL:

INSERT INTO output_table (code) SELECT code FROM input_table;

UPDATE input_table "WITH THE NEW IDS"

Result:

input_table:   code  new_id
                aa    100
                bb    101

output_table:   id   code
                ...  ...
                100  aa
                101  bb

For several reasons I cannot rely on the uniqueness of code in output_table.

Any hint?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

燕归巢 2024-11-09 13:31:08
set @max_orig_id = coalesce((select max(id) from output_table),0);
insert into output_table (code) select code from input_table;
update input_table join output_table on input_table.code=output_table.code and output_table.id > @max_orig_id set input_table.new_id=output_table.id;
set @max_orig_id = coalesce((select max(id) from output_table),0);
insert into output_table (code) select code from input_table;
update input_table join output_table on input_table.code=output_table.code and output_table.id > @max_orig_id set input_table.new_id=output_table.id;
赠意 2024-11-09 13:31:08

我认为上面的答案对于多用户来说并不安全。如果你必须并发访问,我建议放弃自动增量并使用你自己的 ID 序列。不幸的是,MySQL 缺少 CREATE SEQUENCE,但您可以使用隐藏的最后值表支持的函数来模拟它。 (不要忘记在函数执行期间完全锁定表,以便多个用户获得不同的 ID。)然后从函数中获取新的 ID 号,并将其提供给 INSERTUPDATE 语句。

某些方言支持 INSERT ... RETURNING 但 MySQL 不支持。

I don't think the answers above are multi-user safe. If you have to have concurrent access, I suggest abandoning the auto-increment and using your own sequence for IDs. Unfortunately, MySQL lacks CREATE SEQUENCE, but you can simulate one with functions backed by a hidden last-value table. (Don't forget to lock the table completely during the function so that multiple users get distinct IDs.) Then get a new ID number from the function any supply it to both the INSERT and UPDATE statements.

Some dialects support INSERT ... RETURNING <column value> but MySQL can't.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文