Ошибка MySQL (HY000): невозможно добавить ограничение внешнего ключа - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь создать схему MySQL для простого интернет-магазина. Мои существующие таблицы выглядят следующим образом:

  • user & mdash; информация о пользователе
  • address & mdash; информация об адресе для пользователей
  • product & mdash; информация о продукте
  • purchase & mdash; график покупок, созданный и приобретенный пользователем

Я создал эти таблицы, используя следующий код SQL:

CREATE TABLE user(
    user_id INT AUTO_INCREMENT,
    first_name VARCHAR(20) NOT NULL, 
    middle_name VARCHAR(20) NOT NULL, 
    last_name VARCHAR(20) NOT NULL, 
    email VARCHAR(40) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL, 
    registered BOOLEAN NOT NULL, 
    phone VARCHAR(12),
    PRIMARY KEY(user_id)
);

CREATE TABLE product(
    product_id INT AUTO_INCREMENT,
    name VARCHAR(40) NOT NULL UNIQUE,
    price DECIMAL(5,2) NOT NULL,
    description VARCHAR(100) UNIQUE,
    PRIMARY KEY(product_id)
);

CREATE TABLE address(
    user_id INT,
    address_id INT,
    city VARCHAR(15) NOT NULL,
    district VARCHAR(20) NOT NULL,
    details VARCHAR(50) NOT NULL,
    is_default BOOLEAN NOT NULL,
    FOREIGN KEY(user_id) REFERENCES user(user_id) ON DELETE CASCADE,
    PRIMARY KEY(user_id, address_id)
);

CREATE TABLE purchase(
    purchase_id INT AUTO_INCREMENT,
    user_id INT,
    total_price DECIMAL(8,2) NOT NULL,
    state ENUM('placed', 'paid', 'shipped', 'received', 'completed', 'cancelled') DEFAULT 'placed',
    user_name VARCHAR(40) NOT NULL,
    full_address VARCHAR(85) NOT NULL,
    FOREIGN KEY(user_id) REFERENCES user(user_id) ON DELETE SET NULL,
    PRIMARY KEY(purchase_id)
);

Теперь я пытаюсь создать финальную таблицу для хранения отдельных предметов в графике покупок, например:

CREATE TABLE purchase_item(
    purchase_id INT,
    product_id INT,
    product_name VARCHAR(40) NOT NULL,
    amount DECIMAL(4,2) NOT NULL,
    price DECIMAL(8,2) NOT NULL,
    FOREIGN KEY(purchase_id) REFERENCES purchase(purchase_id) ON DELETE CASCADE,
    FOREIGN KEY(product_id) REFERENCES product(product_id) ON DELETE SET NULL,
    PRIMARY KEY(purchase_id, product_id)
);

Но я получаю следующую ошибку:

ERROR 1215 (HY000): Cannot add foreign key constraint

У меня нет ошибок, если я обновляю внешний ключ для продуктов следующим образом:

FOREIGN KEY(product_id) REFERENCES product(product_id) ON DELETE CASCADE,

Я хочу удалить purchase_item, если удаляется соответствующий purchase, но не когда удаляется соответствующий product.

1 Ответ

2 голосов
/ 03 июня 2019

https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html говорит:

Если вы указываете действие SET NULL, убедитесь, что вы не объявили столбцы в дочерней таблице как NOT NULL.

Но ваш столбец purchase_item.product_id является частью первичного ключа этой таблицы, что неявно делает столбец NOT NULL.

Нельзя использовать действие SET NULL для первичного ключа в этом столбце.

...