mysql - 表约束——mysql中的主键
问题描述
我有一个下表:
CREATE TABLE `a` (
`a1` int(11) NOT NULL,
`a2` int(11) NOT NULL,
PRIMARY KEY (`a1`,`a2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
在这里当我分配值时,
insert into a values(1,2);
之后,如果我给:
insert into a values(1,20);
insert into a values(10,2);
在这里,我将 a1 和 a2 声明为主键,这意味着它是默认unique
的。not null
但它接受上面给出的重复项(对于 a1 - (1,2) 和 (1,20))。应该不对吧?只有当我给出时它才会给出错误:
insert into a values(1,2);
ERROR 1062 (23000): Duplicate entry '1-2' for key 'PRIMARY'
而我不能将一列(不是列的组合)保留为空。它像对一样执行主键,但not null
在单独的列中。为什么会这样??谁能解释我???
解决方案
当您声明复合主键(a1 和 a2 一起)时,它们必须是唯一的。这意味着您不能插入(1,2)
一次以上。
如果您需要 a1 和 a2 本身是唯一的,则需要在每列上创建唯一索引。
ALTER TABLE a
ADD CONSTRAINT constraint_name UNIQUE KEY(a2);
ALTER TABLE a
ADD CONSTRAINT constraint_name2 UNIQUE KEY(a1);
主键的作用是为每个表行定义唯一性。
推荐阅读
- python - PANDAS Quantiles 不同的答案取决于我们如何提问
- python - 如何为开始游戏按钮创建一个功能以禁用开始屏幕并加载我的主游戏?
- bash - 如何在给定 HISTFILE 路径的非交互式 shell 中查看历史输出?
- python - matplotlib 不显示轴标题和轴名称
- kendo-ui - 剑道网格复选框获取最后选择的值
- sql - PostgreSQL 数据库将脚本视为 ANSI 而不是 UTF8
- sql-server-2016 - SQL - 选择最后一个和上一个与最后一个不同
- c# - 为什么 IsEnabled 是 ILogger 接口的一部分?
- javascript - 如何在localstoage中设置?
- visual-studio-code - vs code + pytest:无法识别的参数:rootdir(在 Windows 上)