表格结构 -
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| candidateId | bigint(20) | NO | | NULL | |
| profileId | bigint(20) | NO | MUL | NULL | |
| clientId | bigint(20) | NO | | NULL | |
| email | varchar(128) | NO | | NULL | |
| verified | tinyint(1) | YES | | 0 | |
| isPrimary | tinyint(1) | YES | | 0 | |
| createdOn | datetime | NO | | NULL | |
| createdBy | bigint(20) | NO | | NULL | |
| encryptedEmail | varchar(255) | NO | | NULL | |
+----------------+--------------+------+-----+---------+---------
目前,encryptedemail中没有数据。
我想创建一个唯一键 - (clientId, profileId, encryptedEmail
)
所以我尝试将加密的电子邮件转换为默认null
,因为有记录
clientId and profileId were duplicate.
我使用的查询 -
ALTER TABLE AlternateEmails MODIFY encryptedEmail varchar(255) NULL,
add constraint `profileId_3`
unique(`encryptedEmail`,`clientId`,`profileId`);
它仍然显示重复的记录错误。
然后我用 -
alter table AlternateEmails drop column encryptedEmail,
add column encryptedEmail varchar(255) default NULL, add constraint
`profileId_3` unique(`encryptedEmail`,`clientId`,`profileId`);
工作得很好。任何人都可以解释为什么简单地修改列不起作用吗?
答案 0 :(得分:0)
更改现有字段的默认值与添加具有新默认值的字段之间存在明显差异:如果更改现有字段的默认值,则不修改已存在的具有旧默认值的数据。
将继续应用新的默认值。
这在MySQL关于alter table声明的文档中有描述:
仅修改表元数据而非表数据的更改 立即因为服务器只需要改变表.frm文件, 不要触摸桌面内容。以这种方式进行了以下更改:
◾...
◾更改列的默认值(NDB表除外)。
...
因此,如果encryptedEmail
字段的默认值不为null,则它有一个空字符串(或您指定的任何其他内容)作为默认值,并且所有已存在的记录都填充了此默认值。将默认值更改为null不会影响已存在的记录,因此encryptedEmail
字段值将彼此重复。
但是,当您删除并重新创建encryptedEmail
字段并将null作为默认值时,MySQL会使用空值填充现有记录,这些值在MySQL中不会被视为重复。