sql中的主键

时间:2014-01-26 10:21:24

标签: mysql sql

我在这里有一些问题,不知道它是如何工作的。 所以我有2个学生表并且注册如下:

CREATE TABLE Students 
 (sid CHAR(20), 
 name CHAR(50), 
 email CHAR(30), 
 age INTEGER, 
 gr INTEGER) 

CREATE TABLE Enrolled 
 (sid CHAR(20), 
 cid CHAR(20), 
 grade CHAR(2), 
PRIMARY KEY (sid,cid)) 

所以我不理解这个特别的行PRIMARY KEY (sid,cid) 有人可以向我解释它是如何工作的吗?我必须指明我有cid.

所在的另一个表课程

是等同的说法是这样的:

CREATE TABLE Enrolled
(sid CHAR(20) foreign key references Students(sid),
cid CHAR(20) foreign key references Courses(cid)
)

3 个答案:

答案 0 :(得分:1)

PRIMARY KEY表示UNIQUENOT NULL

如果您希望sidcid也是FOREIGN KEY,则必须单独指定。

主键有两个字段通常用于表,它是多对多关系的物理表示。在您的数据库设计图中,您将STUDENTCOURSE作为实体,ENROLLMENT作为它们之间的多对多关系。

在物理数据库图中,多对多关系被建模为表,通常对实体表具有复合PRIMARY KEYFOREIGN KEY约束。

答案 1 :(得分:1)

PRIMARY KEY(sid,cid)表示复合主键..这些字段的组合应该是唯一的。

答案 2 :(得分:0)

PRIMARY KEY用于标识表格。定义为PRIMARY KEY的字段或列将在该表的每一行中包含不同的值,并且必须具有值(因此,PRIMARY KEY等同于UNIQUE和{{ 1}})。

NOT NULL可以是单个字段,也可以是多个字段,但它始终满足“每行将有不同的PRIMARY KEY”。

如果您将PRIMARY KEY声明为2列的组合,则可以将其作为示例:

PRIMARY KEY

CREATE TABLE Enrolled 
 (sid CHAR(20), 
 cid CHAR(20), 
 grade CHAR(2), 
PRIMARY KEY (sid,cid)) --PRIMARY KEY with combination of 2 columns

在此示例中,您可以看到列sid | cid | grade 1 1 XX 1 2 XX 2 1 XX 2 2 XX 2 3 XX 或列sid分别重复了值,但没有重复cid的组合。

就像(sid, cid)用于标识表中的行一样,当我们想要关联两个表时,我们可以在一个表中定义PRIMARY KEY以将该表与另一个表相关联。

您的情况是FOREIGN KEY表由复合ENROLLED标识,以表示多对多关系。这就是说:

  • 学生可以参加许多课程。
  • 一门课程可以招收很多学生。

enter image description here

注意*:最佳做法是将PRIMARY KEY定义为数字值,例如PRIMARY KEYSinteger等,因为最好提高索引性能(所有{{ 1}}已经定义了bigint,并且使用“数字”值比使用“字符串”值更快。