sim*_*que 56 mysql null composite-primary-key
我有一张桌子,上面有几列构成主键.存储的数据的性质允许这些字段中的一些具有NULL
值.我设计了我的桌子:
CREATE TABLE `test` (
`Field1` SMALLINT(5) UNSIGNED NOT NULL,
`Field2` DECIMAL(5,2) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`Field1`, `Field2`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
但是,当我运行describe test
它时显示如下:
|| *Field* || *Type* || *Null* || *Key* || *Default* || *Extra*
|| Field1 || smallint(5) unsigned || NO || PRI || ||
|| Field2 || decimal(5,2) unsigned || NO || PRI || 0.00 ||
Run Code Online (Sandbox Code Playgroud)
插入NULL
值时我一直收到错误.
列'Field2'不能为空
这是因为作为主键一部分的字段不能为空吗?除了使用"0"之外,我还有什么其他选择NULL
?
Gir*_*Rao 48
从MySQL文档:
PRIMARY KEY是一个唯一索引,其中所有键列必须定义为NOT NULL.如果它们
没有显式声明为NOT NULL,那么MySQL就会隐式声明(并且默默地).一个表只能有一个PRIMARY KEY.PRIMARY KEY的名称始终为PRIMARY,因此不能用作任何其他类型索引的名称.
http://dev.mysql.com/doc/refman/5.1/en/create-table.html
如果Field2可以为NULL,我会问你为什么需要它作为主键的一部分,因为你需要Field1在所有行之间是不同的.所以Field1本身应该足够作为主键.您可以在Field2上创建不同类型的索引.
小智 25
主键用于使列既独特又不为空
为了插入插入空值,将field2设置为Unique
唯一约束使该字段删除重复但允许空值
主键指出列不能具有NULL
值.因此,用于定义复合主键的列不会出现NULL
.
Oracle服务器还会比较复合主键定义中使用的所有列的组合.如果您的所有列现有数据(例如x,y)与新添加的行匹配,则会引发Unique Constraint Violated的错误.
此外,看看这个主题: 复合主键中的可空列有什么问题?.
此链接提供有关复合键中NULLABLE列可能性的有价值信息!
您可以像这样使用唯一键:
mysql> CREATE TABLE `test` (
-> `Field1` SMALLINT(5) UNSIGNED NOT NULL,
-> `Field2` DECIMAL(5,2) UNSIGNED NULL DEFAULT NULL,
-> UNIQUE KEY (`Field1`, `Field2`)
-> )
-> COLLATE='latin1_swedish_ci'
-> ENGINE=InnoDB;
Query OK, 0 rows affected (0.03 sec)
mysql>
mysql> desc test
-> ;
+--------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+-------+
| Field1 | smallint(5) unsigned | NO | MUL | NULL | |
| Field2 | decimal(5,2) unsigned | YES | | NULL | |
+--------+-----------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
53455 次 |
最近记录: |