【问题标题】:How to know the on delete action of references table while adding foreign keys添加外键时如何知道引用表的删除操作
【发布时间】:2012-06-06 17:05:49
【问题描述】:

我正在努力在数据库上构建新的东西,这些东西已经由其他人构建并且几乎没有文档。我需要添加一个新表,其中包含对已经存在的表的多对多引用。

以下是已经存在的wp_posts表:

+-----------------------+---------------------+------+-----+---------------------+----------------+
| Field                 | Type                | Null | Key | Default             | Extra          |
+-----------------------+---------------------+------+-----+---------------------+----------------+
| ID                    | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| post_author           | bigint(20) unsigned | NO   | MUL | 0                   |                |
| post_date             | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| guid                  | varchar(255)        | NO   |     |                     |                |
| menu_order            | int(11)             | NO   |     | 0                   |                |
| post_type             | varchar(20)         | NO   | MUL | post                |                |
| post_mime_type        | varchar(100)        | NO   |     |                     |                |
| comment_count         | bigint(20)          | NO   |     | 0                   |                |
| legacy_id             | int(11)             | YES  |     | NULL                |                |
+-----------------------+---------------------+------+-----+---------------------+----------------+

我需要创建一个表标签和 tag_posts_reference 来帮助我创建多对多的参考表。 Tag 表是 wp_tags:

+-------+---------------------+------+-----+---------+----------------+
| Field | Type                | Null | Key | Default | Extra          |
+-------+---------------------+------+-----+---------+----------------+
| id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| tag   | varchar(255)        | YES  |     | NULL    |                |
+-------+---------------------+------+-----+---------+----------------+

我在创建表 wp_tags_posts 时遇到问题。它给了我以下错误:

    mysql> create table wp_posts_tags( id bigint(20) unsigned auto_increment, 
    post_id bigint(20) unsigned not null, 
    tag_id bigint(20) unsigned not null, 
    primary key(id), index(post_id), 
    foreign key(post_id) references wp_posts(id) on Update cascade on delete restrict,
index(tag_id), 
    foreign key(tag_id) references wp_tags(id)) 
    ENGINE = INNODB;
    ERROR 1005 (HY000): Can't create table 'openexhibits_dev.wp_posts_tags' (errno: 150)

我认为我应该添加的级联操作有一些删除。我添加了一些并通过反复试验进行了尝试,但它们都不起作用。有没有办法可以找到在创建外键引用时应该使用的删除级联操作?有没有像 dec table_name 这样的命令可以显示这些操作?我尝试过 delete no action 和 delete set null 等,但我不想盲目地通过反复试验来做某事,尤其是在处理表之间的关系时。谁能帮我?非常感谢你。

【问题讨论】:

  • 表使用什么存储引擎?外键约束仅适用于 InnoDB 表。
  • 我正在使用 InnoDB。很抱歉没有在此处添加。

标签: mysql database wordpress foreign-keys relational-database


【解决方案1】:

哪个引擎是您的默认引擎,使用 InnoDB 引擎作为具有外键的表。

mysql> 创建表 wp_tags_posts(id bigint(20) unsigned auto_increment,
tag_id bigint(20) 无符号, post_id bigint(20) 无符号, 主键(id), 外键(tag_id)引用 wp_tags(id), 外键(post_id) 引用 wp_posts(ID))engine=InnoDB;

【讨论】:

  • 我确实添加了它。它仍然不起作用!我应该再补充一点,wp_posts 是一个 wordpress 表。这会改变我指定数据类型的方式吗?不过感谢您的帮助。
【解决方案2】:

这适用于 MySQL 5.5。据我所知,目标表是 Wordpress 表这一事实不应该影响外键引用。

create table wp_posts (
  ID bigint(20) unsigned,
  post_author bigint(20) unsigned,
  post_date datetime,
  guid varchar(255),
  menu_order int(11),
  post_type varchar(20),
  post_mime_type varchar(100),
  comment_count bigint(20),
  legacy_id int(11),
  primary key (ID)
) engine = INNODB;

create table wp_tags (
  id bigint unsigned,
  tag varchar(25),
  primary key (id)
) engine = INNODB;

create table wp_tags_posts(
  id bigint(20) unsigned auto_increment,  
  tag_id bigint(20) unsigned, 
  post_id bigint(20) unsigned, 
  primary key(id), 
  foreign key(tag_id) references wp_tags(id), 
  foreign key(post_id) references wp_posts(ID)
) engine = INNODB;

【讨论】:

  • ERROR 1005 (HY000): Can't create table 'openexhibits_dev.wp_tags_posts' (errno: 150) 和以前一样的错误。
  • @LathaD:编辑您的问题并包含您的 MySQL 版本号。我不认为这应该有所作为,但它可能会。
  • @LathaD:Wordpress 表格使用什么存储引擎?
  • 我找到了一种方法来规避我遇到的上述问题。我没有创建外键,而是使用内部连接从表中检索数据。内连接做的事情几乎和我想从上面的命令中实现的一样。我知道这不是一个解决方案,但它只是暂时绕过上述错误,直到我找到解决方案!感谢大家的帮助。
  • 无论您是否使用外键,都需要使用连接来检索数据。你需要使用外键。他们做与加入相同的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多