6

我正在 mysql 中创建一个新表,并尝试向其中一个字段添加外键约束。

创建表`在线订单`(
  `receiptid` varchar(10) NOT NULL default '',
  `delivereddate` 日期默认为 NULL,
  `cid` int(10) 非空,
  `card#` int(10) 默认 NULL,
  `expire` 日期默认为 NULL,
  主键(`receiptid`),
  FOREIGN KEY (receiptid) REFERENCES 购买
) 引擎=MyISAM 默认字符集=latin1;

但是,在它创建之后,我进入 phpMyAdmin 并导出表。似乎外键约束已经消失了。

创建表`在线订单`(
  `receiptid` varchar(10) NOT NULL default '',
  `delivereddate` 日期默认为 NULL,
  `cid` int(10) 非空,
  `card#` int(10) 默认 NULL,
  `expire` 日期默认为 NULL,
  主键(`receiptid`)
) 引擎=MyISAM 默认字符集=latin1;

phpMyAdmin 是否摆脱了外键或者我在这里做错了什么?

4

4 回答 4

8

您需要使用 InnoDB 引擎来拥有外键。

参考:http ://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

于 2008-11-17T20:18:15.043 回答
6

当您使用 MyISAM 存储引擎定义表时,它会接受FOREIGN KEY约束,但会默默地丢弃它们。它会解析它们,但不会将约束存储在表元数据中,因此无法强制执行约束。当您要求查看数据库对表定义的想法时,它对该约束一无所知,正如您所发现的那样。

约束也会发生同样的事情CHECK(不管存储引擎如何);它解析语法并接受它,然后忽略它。

恕我直言,这对于 MySQL 产品来说是一件可怕的事情。它接受标准 SQL 而没有错误,给您留下的印象是它将以标准方式支持约束。但事实并非如此!甚至没有SHOW WARNINGS表明 MySQL 忽略了约束。

如果您使用 InnoDB 存储引擎,它会注意外键约束。

于 2008-11-17T23:10:24.320 回答
1

此外,PHPMyAdmin 删除提取任何约束,直到所有表都已创建并已插入数据。如果您使用 PHPMySql 为您转储表格,您会在文件末尾找到一个包含所有 ADD CONSTRAINT 条目的 UPDATE 表格部分。

于 2011-05-19T20:28:19.000 回答
0

使用 phpmyadmin 管理表时有两种类型的约束:

  • 内部:当您使用 phpmyadmin 设计器设置约束时,例如存储为内部的约束,将不会包含在导出中。
  • innoDB:导出中包含的这些限制查看有关它的链接视频

[视频:设置外键约束][1]

于 2016-02-16T15:59:27.127 回答