Kaj*_*aji 21 mysql key primary-key
我正在尝试学习如何使用密钥并打破必须SERIAL
为所有表中的所有行设置类型ID 的习惯.与此同时,我也在做多对多的关系,因此要求协调关系的表中任一列的唯一值会妨碍这一点.
如何在表上定义主键,以便任何给定值都可以在任何列中重复,只要所有列的值组合永远不会重复?
Adr*_*der 48
引用自CREATE TABLE语法页面:
PRIMARY KEY可以是多列索引.但是,您无法使用列规范中的PRIMARY KEY键属性创建多列索引.这样做只会将单列标记为主列.您必须使用单独的PRIMARY KEY(index_col_name,...)子句.
这样的东西可以用于多列主键:
CREATE TABLE
product (
category INT NOT NULL,
id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)
);
Run Code Online (Sandbox Code Playgroud)
new*_*ver 19
主键是一个域概念,它唯一地(必然且充分地)在类似实体中标识您的实体.仅当密钥的一部分引用另一个域实体的特定实例时,复合(多列)主键才有意义.
假设你有个人藏书.只要你一个人,就可以计算它们并为每个数字分配一个数字.该数字是库的域的主键.
现在您想要将您的库与您的邻居库合并,但仍然能够区分书籍所属的人.域现在更广泛,主键现在是(owner,book_id).
因此,制作每个主键复合不应该是您的策略,而是应该在需要时使用它.
现在关于MySQL的一些事实.如果你定义一个复合主键,并希望RDBSM为自动增量为您的ID,你应该知道MyISAM和InnoDB行为之间的区别.
假设我们想要一个包含两个字段的表:parent_id,child_id.我们希望child_id能够自动增加.
MyISAM将在具有相同parent_id的记录中唯一自动增量,InnoDB将在整个表中自动增量.
在MyISAM中应定义主键(PARENT_ID,child_id),并在作为InnoDB的(child_id,PARENT_ID),因为自动增量字段应该在InnoDB的主键中最左边的成分.