您好,我正在使用MySQL,并且已经在我的SQL中使用表约束声明了原子主键,这是不是一个糟糕的做法?
发布于 2012-05-05 23:26:01
当你说“列约束”时,你是指这个吗?
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只跨越一个字段时,你会想要使用它。
相反,如果你想给主键命名或者它是复合的,你可以使用“表级”语法。
下面是一个跨两列的命名主键示例:
CREATE TABLE `clients` (
...
CONSTRAINT `my_primary_key` PRIMARY KEY (`id1`, `id2`)
);发布于 2012-05-05 23:23:37
您所拥有的是最佳实践。将所有约束放在列之后。
更容易阅读(至少对我来说是这样):在表的定义中,所有约束(和索引)都分组在一起。
一致性:不能将复合主键声明为列约束,因此可以在所有表定义中的同一位置声明所有主键约束。
不易出错:必须以这种方式定义外键约束。如果您试图将它们定义为列约束,它们将在MySQL中被(默默地)忽略!
我不确定“原子”在这种情况下应该是什么意思,我猜它的意思是键不是复合的(复合的),而是只有一列。
发布于 2012-05-05 23:29:41
在执行此列约束时,它们是相同的
create table xx(
id int primary key,
txt text not null
);当您的数据库管理工具创建一个脚本时,它看起来是这样的:
CREATE TABLE xx
(
id integer NOT NULL,
txt text NOT NULL,
CONSTRAINT xx_pkey PRIMARY KEY (id )
)将主键设置为表约束的好处是,您可以以更具描述性的方式命名主键。
您的第一种方法(表约束)的另一个优点是,如果您决定创建一个复合主键,则可以实现:
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)
);您不能使用列约束执行此操作
create table yy
(
country_id int not null primary key,
city_id int not null primary key,
population int not null
);无论哪种情况,你的朋友在列约束上都不准确,没有列约束(Sic)(他们可能指的是列级主键),列的主键性信息不会保存在列级(即使您使用的是单列主键)
将主键放在列级别只是语法上的便利,但是它们不会保存在那里,您的RDBMS仍然会将该信息放在表级别
https://stackoverflow.com/questions/10463117
复制相似问题