我有一个表'posts',有一堆现有的行。对于这些行的子集,我正在创建一个新表'specialposts',并引用原始'posts'表中的现有行。由于遗留的原因,它将成为我的&如果对于所有'specialposts'行,我的客户的生活会更容易,他们的主键与主键相同 '帖子'表。
我没有在没有首先创建相应的Post行的情况下创建一个SpecialPost - 我可以通过在每个专门的INSERT上手动指定主键而不是依赖于自动增量来遇到什么问题?
答案 0 :(得分:1)
如果没有提供任何值,AUTO_INCREMENT
列将自动填充值,但如果您想提供一个值,则可以自由填充。请注意,如果这是PRIMARY KEY
列,则必须提供唯一ID,并且冲突会产生错误。
只要不存在冲突风险,保持表之间的标识符同步即可。
如果你有一些代码有时会指定固定ID,而其他时候会自动发出它们,你可能会遇到麻烦,你可能会遇到竞争条件。为了简化操作,您可能需要确保辅助表在主键上已关闭AUTO_INCREMENT
。
答案 1 :(得分:1)
问:我可以通过在每个specialpost
INSERT上手动指定主键而不是依赖自动增量来遇到什么问题?
A:在为PRIMARY KEY约束定义为(或作为其一部分)的列提供值时,没有问题(就数据库而言)。
您将遇到的问题是确定/检索插入id
表中的行的post
auto_increment值的值。
对于单例插入(将单行插入post
表),在INSERT之后检索分配给AUTO_INCREMENT列的值很容易:
SELECT LAST_INSERT_ID();
您可以在INSERT中将返回的值提供给specialpost
表。
(请注意,对于多行插入,LAST_INSERT_ID()返回的值将是分配给第一行行的值。)
根据您的描述,听起来您还想在两个表之间定义FOREIGN KEY约束,specialpost
引用post
中的行。
例如:
post
( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
specialpost
( post_id INT UNSIGNED PRIMARY KEY
, CONSTRAINT FK_specialpost_post FOREIGN KEY (post_id) REFERENCES post (id)