MySQL-Can';t创建表(错误号:150)-外键约束
我想在我的MySQL数据库中创建以下3个表:MySQL-Can';t创建表(错误号:150)-外键约束,mysql,constraints,cascade,Mysql,Constraints,Cascade,我想在我的MySQL数据库中创建以下3个表: CREATE TABLE categories ( category_id SMALLINT NOT NULL AUTO_INCREMENT, category VARCHAR(255) NOT NULL UNIQUE, description TINYTEXT NOT NULL, PRIMARY KEY (category_id) ); CREATE TABLE product ( product_id
CREATE TABLE categories (
category_id SMALLINT NOT NULL AUTO_INCREMENT,
category VARCHAR(255) NOT NULL UNIQUE,
description TINYTEXT NOT NULL,
PRIMARY KEY (category_id)
);
CREATE TABLE product (
product_id SMALLINT NOT NULL AUTO_INCREMENT,
product VARCHAR(255) NOT NULL UNIQUE,
description TINYTEXT NOT NULL,
price DECIMAL(6,2) NOT NULL,
PRIMARY KEY (product_id)
);
CREATE TABLE categories_products (
category_id SMALLINT NOT NULL,
product_id SMALLINT NOT NULL,
PRIMARY KEY (category_id, product_id),
FOREIGN KEY (category_id) REFERENCES categories (category_id)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (product_id) REFERENCES products (product_id)
ON DELETE CASCADE ON UPDATE CASCADE
);
问题在于最后一张桌子。我得到一个错误:
1005-无法创建表“test1.categories\u products”(错误号:
150)
但是,当我尝试在没有约束的情况下创建它时,它是有效的
CREATE TABLE categories_products (
category_id SMALLINT NOT NULL,
product_id SMALLINT NOT NULL,
PRIMARY KEY (category_id, product_id)
);
我需要的约束,以防产品或类别被删除。我做错了什么
CREATE TABLE categories (
category_id SMALLINT NOT NULL AUTO_INCREMENT,
category VARCHAR(255) NOT NULL UNIQUE,
description TINYTEXT NOT NULL,
PRIMARY KEY (category_id)
);
CREATE TABLE products (
product_id SMALLINT NOT NULL AUTO_INCREMENT,
product VARCHAR(255) NOT NULL UNIQUE,
description TINYTEXT NOT NULL,
price DECIMAL(6,2) NOT NULL,
PRIMARY KEY (product_id)
);
CREATE TABLE categories_products (
category_id SMALLINT NOT NULL,
product_id SMALLINT NOT NULL,
PRIMARY KEY (category_id, product_id),
FOREIGN KEY (category_id) REFERENCES categories (category_id)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (product_id) REFERENCES products (product_id)
ON DELETE CASCADE ON UPDATE CASCADE
);
您创建了“产品”,但引用了“产品”
顺便说一下,您应该创建一个ID列,并将此列用作“categories_products”中的主键,并在两个列上添加第二个(唯一)索引。这是最佳实践,INNODB确实会在内部创建ID列,所以
您创建了“产品”,但引用了“产品”
顺便说一下,您应该创建一个ID列,并将此列用作“categories_products”中的主键,并在两个列上添加第二个(唯一)索引。这是最佳实践,INNODB确实在内部创建了一个ID列,所以…似乎有输入错误
CREATE TABLE product
(单数)
然后引用
FOREIGN KEY (product_id) REFERENCES products (product_id)
(复数)。好像是打字错误
CREATE TABLE product
(单数)
然后引用
FOREIGN KEY (product_id) REFERENCES products (product_id)
(复数)。不,不是。这是个打字错误。我再试了一次,但仍然出现同样的错误。我编辑了我的帖子。错误不是由打字错误引起的。@nlsbshtr就是这样。这真的很尴尬。。。谢谢你的帮助。不是的。这是个打字错误。我再试了一次,但仍然出现同样的错误。我编辑了我的帖子。错误不是由打字错误引起的。@nlsbshtr就是这样。这真的很尴尬。。。感谢您的帮助。感谢您的回答,也感谢您的“良好实践”提示。在
类别\u产品
上创建“ID”列的唯一原因是如果一个产品可以分配到多个类别。如果不是这样,那么创建一个人工主键只会增加表的开销(因为您现在有两个索引而不是一个),而不会带来任何好处。在这种特定情况下,如果唯一索引的列不能为null,那么这就是开销,是的。尽管如此,在没有此类索引的情况下,InnoDB将创建一列以满足内部需求,例如。因此,我认为在所有情况下创建该列都是一种良好的态度。感谢您的回答,也感谢“良好实践”提示。在类别\u产品
上创建“ID”列的唯一原因是如果一个产品可以分配到多个类别。如果不是这样,那么创建一个人工主键只会增加表的开销(因为您现在有两个索引而不是一个),而不会带来任何好处。在这种特定情况下,如果唯一索引的列不能为null,那么这就是开销,是的。尽管如此,在没有此类索引的情况下,InnoDB将创建一列以满足内部需求,例如。因此,我认为在所有情况下创建专栏都是一种良好的态度。