(我的)SQL:在“INSERT INTO ... SELECT”中获取新的 id
我必须将从另一个表中选择的记录插入到一个表中,然后使用为后者生成的 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_table
中 code
的唯一性。
有什么提示吗?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为上面的答案对于多用户来说并不安全。如果你必须并发访问,我建议放弃自动增量并使用你自己的 ID 序列。不幸的是,MySQL 缺少
CREATE SEQUENCE
,但您可以使用隐藏的最后值表支持的函数来模拟它。 (不要忘记在函数执行期间完全锁定表,以便多个用户获得不同的 ID。)然后从函数中获取新的 ID 号,并将其提供给INSERT
和UPDATE
语句。某些方言支持
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 theINSERT
andUPDATE
statements.Some dialects support
INSERT ... RETURNING <column value>
but MySQL can't.