2011-11-04 45 views
0
CREATE TABLE titlexplan(
    id INTEGER NOT NULL, 
    title_id INTEGER NOT NULL , 
    plan_id INTEGER NOT NULL , 
    start_date DATETIME NOT NULL, 
    end_date DATETIME 
    CHECK (start_date < end_date), 
    PRIMARY KEY(id), 
    INDEX (title_id), 
    FOREIGN KEY (title_id) 
    REFERENCES title(id) 
    INDEX (plan_id), 
    FOREIGN KEY (plan_id) 
    REFERENCES plan(id)  
); 

这是我正在使用的代码,并且出现语法错误:#​​1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INDEX (plan_id), FOREIGN KEY (plan_id) REFERENCES plan(id))' at line 10我应该索引一个外键?我应该使用这张表的主键吗?

我试图让title_id和plan_id更新,当其他表中的相应ID更新时,我试图跟踪更改。

我一直无法找到一个明确的指导如何做到这一点,这些查询部分工作,但不是全部。我不认为我在这张表中需要一个主键,但是当我不使用主键时,我得到一个警告:“Warning, table contains no primary key”。所以,我只是添加了'id'列。不过,我并不认为这是真正需要的。

请指教。

谢谢。

+0

你得到的错误是因为mssing逗号:'参考资料标题(ID),' –

回答

1
CREATE TABLE titlexplan(
    id INTEGER NOT NULL, 
    title_id INTEGER NOT NULL , 
    plan_id INTEGER NOT NULL , 
    start_date DATETIME NOT NULL, 
    end_date DATETIME 
    CHECK (start_date < end_date), 
    PRIMARY KEY(id), 

    FOREIGN KEY (title_id) 
    REFERENCES title(id) 
    ON UPDATE CASCADE, 

    FOREIGN KEY (plan_id) 
    REFERENCES plan(id) 
    ON UPDATE CASCADE 
); 

我相信这应该工作。 “ON UPDATE CASCADE”会导致这些外键随时更新它们引用的更新密钥。

另外请确保您使用innoDB引擎的外键正常工作。

如果你不想id列和title_id上​​的组合和plan_id的数据类型总是独一无二的,你可以做

CREATE TABLE titlexplan(
    title_id INTEGER NOT NULL , 
    plan_id INTEGER NOT NULL , 
    start_date DATETIME NOT NULL, 
    end_date DATETIME 
    CHECK (start_date < end_date), 
    PRIMARY KEY(title_id, plan_id), 

    FOREIGN KEY (title_id) 
    REFERENCES title(id) 
    ON UPDATE CASCADE, 

    FOREIGN KEY (plan_id) 
    REFERENCES plan(id) 
    ON UPDATE CASCADE 
); 
+0

你为什么要把他们两个主ID在第二个例子中,克莱? –

+0

另外,我可以证实这个作品。 –

+1

我这样做,这样你就不必创建一个额外的列'ID'作为主键。相反,如果title_id和plan_id的组合可以代表组合的主键,那么只要该组合将始终是唯一的 –

1

克莱展示了如何做级联,所以我只想补充一点:

在外键上创建索引通常是一个好主意。如果你正在做一个级联,你真的应该。

我不认为在标准SQL中有任何方法可以创建索引作为CREATE TABLE的一部分。 (MYSQL可能有一个扩展来做到这一点 - 我承认我没有检查。)所以你应该单独创建索引。

create index idx_titlexplan_title on titlexplan (title_id); 
create index idx_titlexplan_plan on titlexplan (plan_id); 
+0

谢谢。请问为什么这是一个好主意? –

+0

另外,这是什么样的命名约定呢? 'idx_titlexplain_title'似乎是一个索引非常尴尬的名字。 heh –

+0

我注意到,如果我不这样写,它就不起作用。我明白你是怎么做到的。 –

2

你得到,因为缺少逗号的错误:

... 
    INDEX (title_id), 
    FOREIGN KEY (title_id) 
    REFERENCES title(id) ,  --- <---- missing comma here 
    INDEX (plan_id), 
    FOREIGN KEY (plan_id) 
    REFERENCES plan(id) 
); 

另一件事是CHECK约束你:

CHECK (start_date < end_date), 

这将产生任何错误,但SQL引擎将不要检查那个约束。作为MySQL的文档中CREATE TABLE, CHECK constraints解释:

The CHECK clause is parsed but ignored by all storage engines.

相关问题