Встроенный внешний ключ MySQL не накладывает ограничений

0

У меня есть две таблицы, одна из которых является первичной таблицей, а другая - дочерней таблицей/таблицей внешнего ключа, и у меня нет ни одной строки в первичной таблице, но все же дочерняя таблица допускает вставку строк без каких-либо ограничений... Почему это происходит

CREATE TABLE CUSTOMERS(
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25) ,
   SALARY   DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

CREATE TABLE ORDERS (
   ID          INT        NOT NULL,
   DATE        DATETIME, 
   CUSTOMER_ID INT references CUSTOMERS(ID),
   AMOUNT     double,
   PRIMARY KEY (ID)
);

когда я вставляю данные в дочернюю таблицу без вставки в основную таблицу, она принимает... но не должна.. пожалуйста, помогите

Теги:
javafx

2 ответа

1
CUSTOMER_ID INT references CUSTOMERS(ID)

Из документации MySQL CREATE TABLE:

MySQL анализирует, но игнорирует "встроенные спецификации ссылок" (как определено в стандарте SQL), где ссылки определяются как часть спецификации столбца. MySQL принимает предложения REFERENCES только если они указаны как часть отдельной спецификации FOREIGN KEY.

Вы должны явно объявить внешний ключ, например:

CREATE TABLE ORDERS (
   ID          INT NOT NULL,
   DATE        DATETIME, 
   CUSTOMER_ID INT,
   AMOUNT      DOUBLE,
   PRIMARY KEY (ID),
   FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMERS(ID)
);

Кроме того, обычно рекомендуется сделать столбец ссылок не обнуляемым, поскольку внешний ключ по умолчанию допускает значения NULL.

CREATE TABLE ORDERS (
   ID          INT NOT NULL,
   DATE        DATETIME, 
   CUSTOMER_ID INT NOT NULL,
   AMOUNT      DOUBLE,
   PRIMARY KEY (ID),
   FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMERS(ID)
);

Демо на БД Fiddle

0

Вы должны объявить столбец внешнего ключа "не нуль", если вы не хотите разрешать нулевые значения там.

CREATE TABLE ORDERS (
   ID          INT        NOT NULL,
   DATE        DATETIME, 
   CUSTOMER_ID INT NOT NULL references CUSTOMERS(ID),
   AMOUNT     double,
   PRIMARY KEY (ID)
);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню