Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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/7/kubernetes/5.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-Can';t创建表(错误号:150)-外键约束_Mysql_Constraints_Cascade - Fatal编程技术网

MySQL-Can';t创建表(错误号:150)-外键约束

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

我想在我的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 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将创建一列以满足内部需求,例如。因此,我认为在所有情况下创建专栏都是一种良好的态度。