MySQL内联外键不适用限制

时间:2019-02-02 21:19:40

标签: php mysql sql

我有两个表,一个是主表,另一个是子表/外键表,我在主表中没有任何行,但是子表仍然接受行插入而没有任何限制...为什么正在发生

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)
);

当我将数据插入到子表wihtout插入主TBL,它接受..但它不应该..请帮助

2 个答案:

答案 0 :(得分:2)

CUSTOMER_ID INT references CUSTOMERS(ID)

来自the MySQL CREATE TABLE documentation

  

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)
);

Demo on DB Fiddle

答案 1 :(得分:0)

您必须声明的外键列“非空”,如果你不希望允许空值存在。

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