Mysql向在insert中跳过的col添加NULL,并且col是唯一的
我正在尝试添加流动的Mysql向在insert中跳过的col添加NULL,并且col是唯一的,mysql,sql,Mysql,Sql,我正在尝试添加流动的insert: INSERT INTO `user` (`name`, `family`, `status`, `mobile`, `ip`, `lastIp`, `seenTime`, `createTime`, `updateTime`) VALUES ('Mehdi Abbasi', NULL, 4, '989197659980', '149.154.167.210', '149.154.167.210', 1507650436, 1507650436, 15
insert
:
INSERT INTO `user`
(`name`, `family`, `status`, `mobile`, `ip`, `lastIp`, `seenTime`, `createTime`, `updateTime`)
VALUES
('Mehdi Abbasi', NULL, 4, '989197659980', '149.154.167.210', '149.154.167.210', 1507650436, 1507650436, 1507650436)
在数据库中,我有:
数据库中家庭另存为Null
的空值,这没有问题,但跳过了由Null
填充的类似email
的COL,并且在尝试添加另一个用户时,忽略了email,从数据库中获取重复密钥错误
注意:电子邮件
字段具有唯一键
这个问题很奇怪,因为它在过去是有效的
表架构为:
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`passwordResetToken` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`family` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`email` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`mobile` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`status` smallint(1) NOT NULL DEFAULT '1',
`ip` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`lastIp` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`seenTime` int(20) DEFAULT NULL,
`updateTime` int(20) DEFAULT NULL,
`createTime` int(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Indexes for table `user`
--
ALTER TABLE `user`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `email` (`email`),
ADD UNIQUE KEY `mobile` (`mobile`),
ADD UNIQUE KEY `passwordResetToken` (`passwordResetToken`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `user`
--
ALTER TABLE `user`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
例如passwordResetToken
和email
giveNULL
但family
不是。
family
col make没有问题,但是email
make.最可能的答案是您使用默认值将user.email
列创建为NOT NULL
如果您确实希望在user.email
列上有一个唯一的索引,并允许多行没有email
值,那么您需要更改表以使user.email
列允许NULL
值
下面是一个使用您的模式的示例,演示如何成功添加多个具有NULL
email
值的行,尽管索引是唯一的:
mysql > CREATE TABLE `user` (
-> `id` int(11) NOT NULL,
-> `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
-> `passwordResetToken` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-> `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
-> `family` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-> `email` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-> `mobile` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-> `status` smallint(1) NOT NULL DEFAULT '1',
-> `ip` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-> `lastIp` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-> `seenTime` int(20) DEFAULT NULL,
-> `updateTime` int(20) DEFAULT NULL,
-> `createTime` int(20) DEFAULT NULL
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.02 sec)
mysql > alter table user add unique index email (email);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql > insert into user (id,password,name) values (1,'foo','foo');
Query OK, 1 row affected (0.02 sec)
mysql > insert into user (id,password,name) values (2,'foo','foo');
Query OK, 1 row affected (0.01 sec)
mysql [localhost] {msandbox} (test) > select * from user;
+----+----------+--------------------+------+--------+-------+--------+--------+------+--------+----------+------------+------------+
| id | password | passwordResetToken | name | family | email | mobile | status | ip | lastIp | seenTime | updateTime | createTime |
+----+----------+--------------------+------+--------+-------+--------+--------+------+--------+----------+------------+------------+
| 1 | foo | NULL | foo | NULL | NULL | NULL | 1 | NULL | NULL | NULL | NULL | NULL |
| 2 | foo | NULL | foo | NULL | NULL | NULL | 1 | NULL | NULL | NULL | NULL | NULL |
+----+----------+--------------------+------+--------+-------+--------+--------+------+--------+----------+------------+------------+
2 rows in set (0.00 sec)
问题的原因有两方面: 1) 您确实允许为
电子邮件插入空值。
这本身并不是错误的原因,正如您可以看到的那样,Family
列没有任何问题
2) 另一方面,您要求列email
具有唯一的值。
这就是允许空值的收缩。
我不确定您是否能够在电子邮件
中插入至少一条空记录,但多次插入空记录将在重复的“值”上触发错误
所以:不要让您的应用程序在电子邮件中插入null
我最终解决了我的问题,方法是添加数据库并再次创建它,然后在其中插入备份行
我根本不知道为什么会发生这个问题 请将表的创建代码添加到问题中。是否可以添加表架构?由于NULL
不等于或不等于NULL
,唯一性约束不适用。@IvoP,我编辑了这个问题。我允许电子邮件接受空值,但它存在“生成重复索引”问题。是的,我绝对希望这样,但我想知道为什么mysql不能正确工作并生成此问题。@Amin mysql允许在唯一索引中使用多个空值。您使用的是什么版本的MySQL?您能发布您的实际CREATE TABLE
语句吗?你发布的那条没有唯一索引,因此你得到了重复的键错误,这不是正确的CREATE TABLE
语句。我通过电子邮件将多记录插入了空模式。