php - MySQL 内联外键不应用限制

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

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

最佳答案

CUSTOMER_ID INT references CUSTOMERS(ID)

来自the MySQL CREATE TABLE documentation :

MySQL parses but ignores “inline REFERENCES specifications” (as defined in the SQL standard) where the references are defined as part of the column specification. MySQL accepts REFERENCES clauses only when specified as part of a separate FOREIGN KEY specification.

您应该显式声明外键,例如:

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

关于php - MySQL 内联外键不应用限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54497631/

相关文章:

sql - 在表上插入或更新违反外键约束

sql - Sequelize hasMany 失败

php - 向多个收件人发送电子邮件时出现问题

phpbb3 数据库索引太长

html - 这个数据是什么类型的结构?

mysql - 需要使用mysql查询在前两列中注入(inject)数据

php - 我的工厂是反模式吗?

php - 过滤多个复选框php的更好方法

php - 从 CSV 文件导入数据时如何消除 "Notice: Undefined offset: 1"错误

sql - 如何更新数据库中所有表的列值的特定字符