mysql外键复合主键[重复]

Posted

技术标签:

【中文标题】mysql外键复合主键[重复]【英文标题】:mysql foreign key to compound primary key [duplicate] 【发布时间】:2016-07-04 00:55:25 【问题描述】:

我尝试使用 mysql Server 5.x 实现以下目标。

我创建了一个名为 Customer 的表,如下所示:

CREATE TABLE Customer(
Title VARCHAR(30) NOT NULL, 
Name VARCHAR(100) NOT NULL, 
FirstName VARCHAR(100) NOT NULL, 
Street VARCHAR(300) NOT NULL, 
HouseNumber VARCHAR(30) NOT NULL, 
ZipCode VARCHAR(30) NOT NULL, 
City VARCHAR(100) NOT NULL, 
Telephone VARCHAR(30) NOT NULL, 
EMail VARCHAR(300) NULL, 
CONSTRAINT PK_Customer PRIMARY KEY(Title,Name,FirstName),
INDEX Index_Name(Name));

还有一个名为 'Order' 的表创建如下:

CREATE TABLE `Order`(
Number BIGINT NOT NULL AUTO_INCREMENT,
Customer VARCHAR(230) NOT NULL,
Issued DATETIME NOT NULL,
PRIMARY KEY(Number),
CONSTRAINT FK_Customer FOREIGN KEY(Customer) 
REFERENCES Customer(PK_Customer));

但我的号码有误:

ERROR 1005 (HY000): Can't create table 'SBZ.Order' (errno: 150)

innodb 引擎状态告诉我:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
160317 16:05:29 Error in foreign key constraint of table SBZ/Order:
FOREIGN KEY(Customer) REFERENCES Customer(PK_Customer)):
Cannot resolve column name close to:
))

是否可以使用约束为复合主键创建外键?

任何帮助appriciated。 :)

【问题讨论】:

【参考方案1】:

首先,您应该在第一个表中有一个CustomerId 列。它应该是自动递增的。所以正确的定义是:

CREATE TABLE Customer (
    CustomerId int auto_increment primary key,
    . . .
    unique (title, firstname, name)
);

然后你可以创建一个正确的与CustomerId的外键关系:

CustomerId int,
. . .
CONSTRAINT FK_Customer FOREIGN KEY(CustomerId) REFERENCES Customer(CustomerId)

这是“正确的”,因为这样的合成密钥有几个优点:

外键引用要简单得多。 您可以轻松更改组件(更改外键的一部分需要了解级联约束)。 索引中的整数比字符串更有效。

当然,您可以对复合主键执行相同的操作。您只需要第二个表中的所有三列:

Title VARCHAR(30), 
Name VARCHAR(100), 
FirstName VARCHAR(100), 
CONSTRAINT FK_Customer FOREIGN KEY(Title, Name, Firstname) REFERENCES Customer(Title, Name, Firstname)

【讨论】:

您的列Customer.CustomerId 没有必须自动增加,但它必须是唯一的,自动增加是一种非常方便的方法。【参考方案2】:

您的子表的外键必须包含与父表的主键相同的列,顺序相同。在你的情况下,它看起来像

CREATE TABLE `Order`(
  Number BIGINT NOT NULL AUTO_INCREMENT,
  Title VARCHAR(30) NOT NULL, 
  Name VARCHAR(100) NOT NULL, 
  FirstName VARCHAR(100) NOT NULL,
  ...
  CONSTRAINT FK_Customer FOREIGN KEY (Title, Name, FirstName)
    REFERENCES Customer (Title, Name, FirstName)
);

注意,列不必在表中以相同的顺序只是在约束的列列表中。

【讨论】:

以上是关于mysql外键复合主键[重复]的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库基础(2)索引主键复合主键外键

使用复合主键在联结表上设置外键约束

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)

mysql复合外键引用超过2个属性

Spring用外键保存复合主键