首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -如何使用列约束声明主键?

问MySQL -如何使用列约束声明主键?
EN

Stack Overflow用户
提问于 2012-05-05 23:09:45
回答 4查看 5.8K关注 0票数 1

您好,我正在使用MySQL,并且已经在我的SQL中使用表约束声明了原子主键,这是不是一个糟糕的做法?

EN

回答 4

Stack Overflow用户

发布于 2012-05-05 23:26:01

当你说“列约束”时,你是指这个吗?

代码语言:javascript
复制
CREATE TABLE `clients` (
  `id` int(11) NOT NULL auto_increment PRIMARY KEY,
  `created` datetime NOT NULL,
  `email` varchar(150) NOT NULL,
  `notes` text NOT NULL
);

这两种语言本身并没有什么不好的地方(只是语法上的不同)。

上面的"in column“语法稍微短一些,所以当你不关心命名你的约束和PK只跨越一个字段时,你会想要使用它。

相反,如果你想给主键命名或者它是复合的,你可以使用“表级”语法。

下面是一个跨两列的命名主键示例:

代码语言:javascript
复制
CREATE TABLE `clients` (
  ...
  CONSTRAINT `my_primary_key` PRIMARY KEY (`id1`, `id2`)
);
票数 3
EN

Stack Overflow用户

发布于 2012-05-05 23:23:37

您所拥有的是最佳实践。将所有约束放在列之后。

更容易阅读(至少对我来说是这样):在表的定义中,所有约束(和索引)都分组在一起。

一致性:不能将复合主键声明为列约束,因此可以在所有表定义中的同一位置声明所有主键约束。

不易出错:必须以这种方式定义外键约束。如果您试图将它们定义为列约束,它们将在MySQL中被(默默地)忽略!

我不确定“原子”在这种情况下应该是什么意思,我猜它的意思是键不是复合的(复合的),而是只有一列。

票数 1
EN

Stack Overflow用户

发布于 2012-05-05 23:29:41

在执行此列约束时,它们是相同的

代码语言:javascript
复制
create table xx(
    id int primary key,
    txt text not null   
);

当您的数据库管理工具创建一个脚本时,它看起来是这样的:

代码语言:javascript
复制
CREATE TABLE xx
(
  id integer NOT NULL,
  txt text NOT NULL,
  CONSTRAINT xx_pkey PRIMARY KEY (id )
)

将主键设置为表约束的好处是,您可以以更具描述性的方式命名主键。

您的第一种方法(表约束)的另一个优点是,如果您决定创建一个复合主键,则可以实现:

代码语言:javascript
复制
create table yy
(
   country_id int not null,
   city_id int not null,
   population int,
   constraint xx_primary_key primary key(country_id, city_id)
);

您不能使用列约束执行此操作

代码语言:javascript
复制
create table yy
(
   country_id int not null primary key,
   city_id int not null primary key,
   population int not null
);

无论哪种情况,你的朋友在列约束上都不准确,没有列约束(Sic)(他们可能指的是列级主键),列的主键性信息不会保存在列级(即使您使用的是单列主键)

将主键放在列级别只是语法上的便利,但是它们不会保存在那里,您的RDBMS仍然会将该信息放在表级别

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10463117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档