【问题标题】:Prevent null values are getting inserted into the table for primary key column防止空值被插入到主键列的表中
【发布时间】:2012-11-13 05:34:39
【问题描述】:

不知道是数据库问题还是什么。对于我数据库中的所有表,对于声明为主键的列,在查询时采用 NULL 值或默认值

INSERT INTO TABLE (emp_name,emp_addr,emp_contact,salary) 
values ('Jack','127 N F 14 Stillwater','3456786543',8)

表由emp_id(primary key), emp_name, emp_addr, emp_contact and salary 组成。

如果我想用

插入一个元组
INSERT INTO EMPLOYEE values (NULL,'Jack','127 N F 14 Stillwater','345678543',8)

,它抛出了主键不能为空的错误。

我的表创建脚本是..

    create table Employee(
    emp_id int(11) primary key,
    emp_name varchar(25) not null,
    emp_addr varchar(40) not null,
    emp_contact varchar(10),
    salary float(2)
    )ENGINE=INNODB;

This is what is happening in my DB
 create table sale(sale_id varchar(10) primary key not null,sold_vehicle varchar(12),sm_id int(11),                                                                sale_date date)ENGINE=INNODB;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into sale values('s2389','AP28DJ5093',1290,'05-12-2010');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into sale values('s2420','AP28MY0545',1290,'24-10-2012');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from sale;
+---------+--------------+-------+------------+
| sale_id | sold_vehicle | sm_id | sale_date  |
+---------+--------------+-------+------------+
| s2389   | AP28DJ5093   |  1290 | 0000-00-00 |
| s2420   | AP28MY0545   |  1290 | 0000-00-00 |
+---------+--------------+-------+------------+
2 rows in set (0.00 sec)

mysql> update sale set sale_id = null where sale_id = 's2389';
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> select * from sale;
+---------+--------------+-------+------------+
| sale_id | sold_vehicle | sm_id | sale_date  |
+---------+--------------+-------+------------+
|         | AP28DJ5093   |  1290 | 0000-00-00 |
| s2420   | AP28MY0545   |  1290 | 0000-00-00 |
+---------+--------------+-------+------------+
2 rows in set (0.00 sec)

mysql> desc sale;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| sale_id      | varchar(10) | NO   | PRI | NULL    |       |
| sold_vehicle | varchar(12) | YES  |     | NULL    |       |
| sm_id        | int(11)     | YES  |     | NULL    |       |
| sale_date    | date        | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

【问题讨论】:

  • 你确定你没有在主键上自动递增?
  • 为什么你的主键不为空

标签: mysql database primary-key


【解决方案1】:

您不能将主键字段设为空。并且您必须将 not null 作为主键。否则,拥有主键有什么意义? :) 请将您的创建查询更改为:

CREATE table tblblah(ID NOT NULL PRIMARY KEY, ...等等

;

INSERT INTO table tblblah(ID, ....等等

;

根据您的表架构填充它。

【讨论】:

  • 如果您没有为 ID 字段指定您自己的值(例如员工 IC 号、员工编号...等),那么最好在上面包含 AUTO_INCREMENT 子句。
  • 但主键本身不是空属性。它在 desc 表中显示为 NULL 下的 NO ...我们是否需要明确给出该约束?我认为我们不需要......如果我错了,请纠正我
  • 是的,在 MYSQL 中,不必输入 NOT NULL。当然 PK 本质上是一个“非空”属性。即使您不使用“非空”约束包装您的字段,pk 也不应该允许空值。这就是你得到错误的原因。 (例如,在您的第二个 INSERT 查询中,主键为 NULL)由于您不需要自动递增而是插入您自己的值,因此它非常安全并保持表的完整性以具有显式的“非空”约束 - 所以您不需要依赖 SQL 引擎 - 以避免您在这里遇到的问题。 Ref
【解决方案2】:

在创建表时添加 AUTO_INCREMENT 选项

create table Employee
(
emp_id int(11) AUTO_INCREMENT primary key,
emp_name varchar(25) not null,
emp_addr varchar(40) not null,
emp_contact varchar(10),
salary float(2)
)ENGINE=INNODB;

【讨论】:

  • 但我不需要该键的自动增量.. 我不能有那个选项吗?
  • 如果是这种情况,则删除 AUTO_INCREMENT 并在其上提供一个 ID。 INSERT INTO EMPLOYEE values (1,'Jack','127 N F 14 Stillwater','345678543',8)
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2020-12-28
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
相关资源
最近更新 更多