2

我对 sql 语句有疑问。

我有三个表:worker、HasSkill 和 HasTime。HasSkill 和 HasTime 有一个指向 Worker 表的外键。

(我将该属性作为主键的一部分,如果 w_id 不存在于 Worker 表中,我还想限制插入)

以下是我的sql语句。但是,插入限制不起作用。希望有人能给我一些建议。非常感谢。

 1 CREATE TABLE IF NOT EXISTS Worker
  2 (
  3 id INTEGER NOT NULL AUTO_INCREMENT,
  4 name VARCHAR(30), 
  5 email VARCHAR(30), 
  6 address VARCHAR(255), 
  7 hour_rate INTEGER, 
  8 PRIMARY KEY(id)
  9 ); 
 10 
 11 CREATE TABLE IF NOT EXISTS HasSkill
 12 (
 13 w_id INTEGER NOT NULL, 
 14 skill_name VARCHAR(255), 
 15 PRIMARY KEY(w_id, skill_name), 
 16 FOREIGN KEY(w_id) REFERENCES Worker(id) ON DELETE CASCADE
 17 ); 
 18 
 19 CREATE TABLE IF NOT EXISTS HasTime
 20 (
 21 w_id INTEGER NOT NULL, 
 22 day_of_week TINYINT NOT NULL, 
 23 start_time  TIME NOT NULL, 
 24 end_time TIME NOT NULL, 
 25 PRIMARY KEY(w_id, day_of_week, start_time, end_time), 
 26 FOREIGN KEY(w_id) REFERENCES Worker(id) ON DELETE CASCADE
 27 );
4

2 回答 2

0

最常见的原因是表使用了 MyISAM 存储引擎。尽管声明了外键约束,MyISAM 解析但忽略约束,并且不能强制引用完整性。

使用SHOW TABLE STATUS LIKE 'Has%'并查看“引擎”字段报告的内容。


您可以使用 table 选项指定存储引擎:

CREATE TABLE HasTime ( . . . ) ENGINE=InnoDB;

TYPE=InnoDB是过时的语法。它被认为具有向后兼容性,但首选语法是ENGINE=InnoDB.

从 MySQL 5.5 开始,默认的存储引擎应该是 InnoDB,所以如果你不指定引擎,应该在 InnoDB 中创建表。可以在服务器配置文件中更改此默认设置,但这不是一个好主意。

于 2013-03-19T03:50:02.387 回答
0

感谢@Bill Karwin。

因为我使用的是 mysql。

在每个创建语句的末尾添加 TYPE=InnoDB。

像这些:

CREATE TABLE IF NOT EXISTS HasTime
(
    w_id INTEGER NOT NULL, 
    day_of_week TINYINT NOT NULL, 
    start_time  TIME NOT NULL, 
    end_time TIME NOT NULL, 
    PRIMARY KEY(w_id, day_of_week, start_time, end_time), 
    FOREIGN KEY(w_id) REFERENCES Worker(id) ON DELETE CASCADE
) TYPE=InnoDB;

参考http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html

于 2013-03-20T01:29:08.820 回答