我有两个依赖表
CREATE TABLE posts
(
post_id int(11) unsigned NOT NULL AUTO_INCREMENT,
title varchar(255),
PRIMARY KEY(post_id)
) ENGINE=InnoDB
CREATE TABLE post_meta
(
post_id int(11) unsigned REFERENCES posts(post_id) ON DELETE CASCADE,
info varchar(255),
PRIMARY KEY(post_id)
) ENGINE=InnoDB
问题1:INSERT
进入posts
后,post_meta
不接受错误Duplicate entry XX for key 'PRIMARY
的值。我该如何修改表结构?
问题2:如何设置在post_meta
上INSERT INTO posts
中创建相应的行?我的意思是在post_meta
中创建一行时,在posts
中创建一个空行(仅具有FK的id)。换句话说,在第二列中没有任何INSERT
的两列中具有相同的行数。
答案 0 :(得分:3)
您当前的实现看起来不像标准化形式。您确定需要将数据分成两个不同的表吗?也许
CREATE TABLE posts
(
post_id int(11) unsigned NOT NULL AUTO_INCREMENT,
title varchar(255),
info varchar(255),
PRIMARY KEY(post_id)
) ENGINE=InnoDB
会吗?
推测:如果你因为安全问题而这样做,那么MySQL supports Column-level privileges。
如果由于某些原因使数据规范化是不可接受的,那么你可以在两个表中创建post_id
主键(不要使它成为外键!)并在表posts
上添加INSERT和DELETE触发器这将插入或删除post_meta中的相应行。
<强>更新强>
您在评论中说,您可以在post_meta
表格中拥有与posts
中的单个记录相对应的多条记录。这会改变很多:
post_id
的{{1}}上使用主键。主键必须在表范围内是唯一的。 post_meta
上定义PRIMARY KEY,那么您应该向post_meta
表添加一个新的(可能是auto_increment字段)并将其用作主键。 (此外,即使没有主键,表也可以存在,但它违反了大多数数据库指南)post_meta
上添加INSERT触发器。另一种方法是使用存储过程(仅存储过程)将记录添加到posts
- 在此SP中,您可以编写一些SQL以将必要的记录插入posts
。