所以我刚刚开始在线学习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 100
和UNIQUE
的组合毫无意义。
该列被定义为可以为null,因此可以有许多行的值为null。只有当一行的值不同于null时,它才必须是唯一的。
为了插入null,您需要在INSERT
语句中明确地使用它。如果没有显式设置null,则会写入默认的100。这适用于以这种方式处理的第一行,但第二次100将违反唯一约束,正如您所说。
好吧,可以为null的ID也没有意义,理想情况下,ID应该自动递增,所以你不必担心使用未使用的ID,尤其是在多个进程可能试图同时插入行的环境中。
所以,给定的examle非常糟糕。
DEFAULT 100
和UNIQUE
的组合是有意义的。
这种组合意味着新插入的行应该主要明确指定ID
列值。
该方案允许在不指定ID
值的情况下插入一行。但只有一排。如果您需要插入具有此默认/通用ID
值的另一行,则必须编辑现有行并之前更改其ID
值(或将其删除(。
在实践中,这允许保存原始、不完整、行,并在将来完全编辑它。例如,插入通用行,然后计算所需的行参数并设置所需的引用,最后为该行指定一些明确的ID
值。在此之后,您可以插入另一个通用行并使用它。
当然,这种情况很少见。但在某些情况下,它可能是有用的。