需要明确SQL中的UNIQUE和DEFAULT约束



所以我刚刚开始在线学习SQL,在学习约束的同时,下面给出了使用DEFAULT约束的示例:

CREATE TABLE persons(
ID INT  NULL DEFAULT 100,
f_name VARCHAR(25),
l_name VCARCHAR(25),
UNIQUE(ID)
);

我的问题是,如果ID默认为100,那么可能有多个列的ID为100,所以这不会与确保所有列都具有不同值的UNIQUE约束相矛盾吗?

感谢您的阅读和投入!

Rohan

尽管它是有效的SQL并且mysql允许这样做,但在具有UNIQUE约束的列上定义DEFAULT值是一种糟糕的做法。这种糟糕的模式会导致数据不一致。

mysql> show create table persons;
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                                                                           |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| persons | CREATE TABLE `persons` (
`id` int(11) DEFAULT '100',
`f_name` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
`l_name` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

你是对的,DEFAULT 100UNIQUE的组合毫无意义。

该列被定义为可以为null,因此可以有许多行的值为null。只有当一行的值不同于null时,它才必须是唯一的。

为了插入null,您需要在INSERT语句中明确地使用它。如果没有显式设置null,则会写入默认的100。这适用于以这种方式处理的第一行,但第二次100将违反唯一约束,正如您所说。

好吧,可以为null的ID也没有意义,理想情况下,ID应该自动递增,所以你不必担心使用未使用的ID,尤其是在多个进程可能试图同时插入行的环境中。

所以,给定的examle非常糟糕。

DEFAULT 100UNIQUE的组合是有意义的。

这种组合意味着新插入的行应该主要明确指定ID列值。

该方案允许在不指定ID值的情况下插入一行。但只有一排。如果您需要插入具有此默认/通用ID值的另一行,则必须编辑现有行并之前更改其ID值(或将其删除(。

在实践中,这允许保存原始、不完整、行,并在将来完全编辑它。例如,插入通用行,然后计算所需的行参数并设置所需的引用,最后为该行指定一些明确的ID值。在此之后,您可以插入另一个通用行并使用它。

当然,这种情况很少见。但在某些情况下,它可能是有用的。

相关内容

  • 没有找到相关文章

最新更新