复合外键可能吗?

Composite foreign key is it possible?

我有一个 tables:

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) 
  ) ;

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

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

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

将 Prefix 和 Unique_number 连接在一起对我来说非常重要,因为 Unique_number 下的项目存储在条件 A 或 B 中,并且引用时 Prefix 和 Unique_ number 总是在一起。

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

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

请注意,[] 表示 "optional",| 表示 "one of",, ... 表示您可以添加更多类似的项目,用逗号分隔——您不需要'实际键入这些字符。

链接列的列类型需要匹配——单列外键也是如此。因为你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)
);

使用有意义的名字也是一个不错的主意,甚至(或特别)在学习时也是如此。