У меня есть две таблицы, одна из которых является первичной таблицей, а другая - дочерней таблицей/таблицей внешнего ключа, и у меня нет ни одной строки в первичной таблице, но все же дочерняя таблица допускает вставку строк без каких-либо ограничений... Почему это происходит
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)
);
когда я вставляю данные в дочернюю таблицу без вставки в основную таблицу, она принимает... но не должна.. пожалуйста, помогите
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)
);
Вы должны объявить столбец внешнего ключа "не нуль", если вы не хотите разрешать нулевые значения там.
CREATE TABLE ORDERS (
ID INT NOT NULL,
DATE DATETIME,
CUSTOMER_ID INT NOT NULL references CUSTOMERS(ID),
AMOUNT double,
PRIMARY KEY (ID)
);