Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql中作为主键的外键_Mysql_Sql_Insert_Foreign Keys - Fatal编程技术网

mysql中作为主键的外键

mysql中作为主键的外键,mysql,sql,insert,foreign-keys,Mysql,Sql,Insert,Foreign Keys,我有两个相关的表 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)

我有两个相关的表

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:在
插入
帖子
后,
帖子元
不接受带有错误的值
键的重复条目XX“PRIMARY
。我应该如何修改表结构


问题2:如何设置在
插入帖子时在
post\u meta
中创建相应的行?我的意思是在
posts
中创建行时,在
post\u meta
中创建一个空行(只有FK的id)。换句话说,在两列中有相同数量的行,而在第二列中没有任何
插入

您当前的实现看起来不规范。是否确实需要将数据分隔到两个不同的表中?也许吧

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

如果由于某些原因无法正常化数据,那么您可以在两个表中都设置
post\u id
主键(不要设置为外键!),并在表
posts
上添加INSERT和DELETE触发器,这将插入或删除post\u meta中的相应行

更新

您在评论中说,您可以在
post\u meta
表中有多条记录,对应于
posts
中的单个记录。这改变了很多:

  • 不能在表
    post\u meta
    中的
    post\u id
    上使用主键。主键在表范围中必须是唯一的
  • 您可以设置外键(您已经尝试设置的外键)-这将确保元数据在发布时自动删除
  • 如果您确实需要在
    post\u meta
    上定义主键,那么您应该在
    post\u meta
    表中添加一个新字段(可能是自动增量字段),并将其用作主键。(此外,即使没有主键,表也可以存在,但这违反了大多数DB准则)
  • 如果您需要为每个帖子自动创建一个元记录,那么您可以在
    posts
    上添加一个插入触发器,正如我已经建议的那样。另一种方法是使用存储过程(并且仅使用存储过程)将记录添加到
    posts
    ——在这个SP中,您可以编写一些SQL来将必要的记录插入
    post\u meta

  • 您当前的实现看起来不符合规范化形式。是否确实需要将数据分隔到两个不同的表中?也许吧

    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

    如果由于某些原因无法正常化数据,那么您可以在两个表中都设置
    post\u id
    主键(不要设置为外键!),并在表
    posts
    上添加INSERT和DELETE触发器,这将插入或删除post\u meta中的相应行

    更新

    您在评论中说,您可以在
    post\u meta
    表中有多条记录,对应于
    posts
    中的单个记录。这改变了很多:

  • 不能在表
    post\u meta
    中的
    post\u id
    上使用主键。主键在表范围中必须是唯一的
  • 您可以设置外键(您已经尝试设置的外键)-这将确保元数据在发布时自动删除
  • 如果您确实需要在
    post\u meta
    上定义主键,那么您应该在
    post\u meta
    表中添加一个新字段(可能是自动增量字段),并将其用作主键。(此外,即使没有主键,表也可以存在,但这违反了大多数DB准则)
  • 如果您需要为每个帖子自动创建一个元记录,那么您可以在
    posts
    上添加一个插入触发器,正如我已经建议的那样。另一种方法是使用存储过程(并且仅使用存储过程)将记录添加到
    posts
    ——在这个SP中,您可以编写一些SQL来将必要的记录插入
    post\u meta

  • 如果任何
    post\u meta
    行有
    posts
    行,为什么不在
    post\u meta
    中设置
    post\u id
    FK?问题2:如果任何
    post\u meta
    行有
    posts
    行,那么为什么不在
    post\u meta
    中设置
    post\u id
    FK?问题2:对于触发器,这只是一个简单的例子,元表包含单独的信息。例如,不同帖子类型的多个meta在需要时将与JOIN一起工作。这只是一个简单的例子,meta表包含单独的信息。例如,不同帖子类型的多个meta,在需要时可以使用JOIN。