我看MySQL文档 在这里, 和试图整理出之间的区别外键和制约因素。我想一个FK 一个制约因素,但文档似乎并谈论他们喜欢他们分开的东西。

该法对于创建一个FK被(部分)...

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)

因此,"约束"条款是可选择的。为什么你会包括或不包括吗?如果你离开它不MySQL创建一个外国的关键,但不是一个约束?或是它更像是一个"约束"是什么都不超过一个名为你FK,所以如果你不指定用它,你得到一个匿名FK?

任何澄清将不胜感激。

谢谢,

Ethan

有帮助吗?

解决方案

是的,一个外国的关键类型的制约因素。MySQL具有不均匀支持制约因素:

  • PRIMARY KEY:是的作为表的约束,并列制约因素。
  • FOREIGN KEY:是的作为表的约束,但只有少和传统储存引擎;否则解析的,但忽略。
  • CHECK:分析,但忽略在所有储存的引擎。
  • UNIQUE:是的作为表的约束,并列制约因素。
  • NOT NULL:是的作为列的制约因素。
  • DEFERRABLE 和其他的约束属性:没有支持。

CONSTRAINT 条款允许你名字的约束的明确,以做元数据更具可读性,或者使用名称,当你想要放弃的约束。SQL标准要求的 CONSTRAINT 条款是可选择的。如果你离开她了,RDBMS创建一个名称,名称是以实施。

其他提示

在一般(没有必要的MySQL),外键约束是,但约束并不总是外键。想的主键约束,唯一约束等

说回的具体问题,你是正确的,省略约束[符号]部分将创建一个FK具有自动生成的名称。

现在,我们的创建表Ddl是这种格式的通知的唯一关键和外键定义我们的语法使用。

CREATE TABLE my_dbschema.my_table (
    id INT unsigned auto_increment PRIMARY KEY,
    account_nbr INT NOT NULL,
    account_name VARCHAR(50) NOT NULL,
    active_flg CHAR(1) NOT NULL DEFAULT 'Y',
    vendor_nbr INT NOT NULL,
    create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
    create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
    last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    UNIQUE KEY uk1_my_table(account_nbr, account_name),
    FOREIGN KEY fk1_my_table(vendor_nbr) REFERENCES vendor(vendor_nbr)
    );

在这种格式,MySQL是创建指数-es的名字uk1_my_table和fk1_my_table自动;但FK目的名称是不同的东西-my_table_ibfk_1(ie。tablename_ibfk_N系统的定义)。所以 ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table 不会的工作(并因此挫败和提高警报),如没有FK db对象的,名称。

这是一种替代言格式应用程序的constarints(Ref: https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html) :-

CREATE TABLE my_dbschema.my_table (
    id INT unsigned auto_increment PRIMARY KEY,
    account_nbr INT NOT NULL,
    account_name VARCHAR(50) NOT NULL,
    active_flg CHAR(1) NOT NULL DEFAULT 'Y',
    vendor_nbr INT NOT NULL,
    create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
    create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
    last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    CONSTRAINT uk1_my_table UNIQUE KEY (account_nbr, account_name),
    CONSTRAINT fk1_my_table FOREIGN KEY (vendor_nbr) REFERENCES vendor(vendor_nbr)
    );

在这种格式,MySQL仍然是创建指数-es的名字uk1_my_table和fk1_my_table自动的,但FK对象的名字是不是不同的东西–这是fk1_my_table中提到的言.所以 ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table 工作原理,但留下的名字命名索引。

并且,注意 ALTER TABLE my_table DROP INDEX fk1_my_table 不会的工作最初时(当FK尚不下降),有一个错误信息,它正在使用一个FK!如果降FK命令已经成功地执行,然后下降的索引工作。

希望这个解释,并有助于解决混乱。

不能回答MySQL,但FK的是约束条件。凡是迫使你的数据转化为一定的条件约束。有几种类型的约束,唯一,主键,确认键和外键的所有约束。也许MySQL有其他。

有时字被允许在命令而不是像可读性所需纯属FROM DELETE语句。

如果我没有错,约束需要索引,所以当你创建,例如,外键约束的MySQL会自动创建一个索引了。

这可能是在MySQL最混乱主题。

很多人说,例如,在“PRIMARY KEY”,“洋KEY”和“独一无二”的关键其实是指标! (被包括在这里的MySQL正式文档)

很多人,在另一方面,说他们是相当的约束(这有一定道理,因为当你使用它们,你真的对受影响的列施加限制)。

如果他们真的是索引,那么什么是点使用约束clausule为了给它一个名字,因为你应该能够使用该索引的名字,当你创造了它?

示例:

...外键INDEX_NAME(col_name1,col_name2,...)

如果外键是一个索引,那么我们应该能够使用INDEX_NAME来处理它。然而,我们不能。

但如果他们不索引但是做使用索引来工作实际约束上,那么这有一定道理。

在任何情况下,我们不知道。事实上,似乎没有人知道。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top