可以使用复合外键吗?

时间:2017-07-17 14:23:50

标签: mysql innodb

我有一张桌子:

CREATE TABLE test_part1 ( 

  Prefix ENUM('A','B') NOT NULL, 
  Unique_number int(11) NOT NULL, 
  Data_set1 decimal(5,2), 
  PRIMARY KEY (Prefix, Unique_number)
  ) ;

CREATE TABLE test_part2 ( 
  composite_foregin_key tinytxt(12) NOT NULL, 
  Data1 varchar (11), 
  Data2 varchar (11) 
  ) ;

如何将表“test_part2”中的“test_part1”中的复合键作为外键引用?

我是否需要创建名为fkPrefix和fkUnique_number的2列并使用相同的数据类型,还是可以创建一个名为composite_foregin_key的列?

如果可以使用composite_foregin_key选项,我是否需要将复合键的数据类型更改为前缀txt(1)和Unique_ number txt(11),因为composite_foregin_key将是txt(12)?

将Prefix和Unique_number一起加入是非常重要的,因为Unique_number下的项目存储在条件A或B中,并且当引用的前缀和唯一编号总是在一起时。

我正在尽可能多地学习计算机科学,但这不是我的专业领域,在开展这个项目之前,我很久以前就参与了基本的数据库架构。如果我的问题没有任何意义,请理解。如果需要,我会尝试用其他方式表达。

1 个答案:

答案 0 :(得分:0)

syntax本身很简单:

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

请注意,[]表示"可选",|表示"其中一个"并且, ...表示您可以添加更多以逗号分隔的相似项目 - 您实际上并未输入这些字符。

链接列的列类型需要匹配 - 这两个单列外键也是如此。由于您的test_part1 PK由以下两列组成:

Prefix ENUM('A','B') NOT NULL, 
Unique_number int(11) NOT NULL,

...我希望在test_part2中看到两个类似的类型列,但事实并非如此。您的composite_foregin_key候选人是TINYTEXT,只有一列。

遵循以下准则:

CREATE TABLE test_part1 ( 
    Prefix ENUM('A','B') NOT NULL, 
    Unique_number int(11) NOT NULL, 
    Data_set1 decimal(5,2),

    PRIMARY KEY (Prefix, Unique_number)
);

CREATE TABLE test_part2 ( 
    composite_foregin_key_1 ENUM('A','B') NOT NULL, 
    composite_foregin_key_2 int(11) NOT NULL, 
    Data1 varchar (11), 
    Data2 varchar (11),

    CONSTRAINT test_part2_fk1 FOREIGN KEY (composite_foregin_key_1, composite_foregin_key_2)
    REFERENCES test_part1 (Prefix, Unique_number)
);

在学习时,即使(或特别)使用有意义的名字也不是一个坏主意。