mysql没有主键会怎么样?
数据库设计是一个令人挠头的问题,尤其是当我们涉及到各种设置和优化时。一个常见的问题是,如果在使用 MySQL 的 InnoDB 存储引擎时没有设置自增主键,会发生什么呢?本文将深入探讨这个问题,帮助你...
2024.11.12主键与唯一约束区别在面试有可能会被问到。可以从以下几个方面对比一下。
1、保证唯一性2、是否允许为空3、一个表可以有多少个4、是否允许组合保证唯一性两者都保证字段值的唯一性。
建一个学生表
create table student( id int PRIMARY key, #主键 name VARCHAR(20) NOT NULL,#非空 seat int UNIQUE#唯一)id是主键,seat座位号唯一。
先插入两条id相同的数据测试。
mysql> insert into student -> (id,name,seat) -> VALUES -> (1,‘haha‘,1), -> (1,‘john‘,2);ERROR 1062 (23000): Duplicate entry ‘1‘ for key ‘PRIMARY‘上面语句是一次插入多条数据,报错因为id主键的值重复了,语句执行失败。
插入seat相同数据测试
mysql> insert into student (id,name,seat) VALUES (1,‘haha‘,1), (2,‘john‘,1);ERROR 1062 (23000): Duplicate entry ‘1‘ for key ‘seat‘同样报错。
是否允许空值在学生表中插入一条id为null的数据
mysql> insert into student ->(id,name,seat) ->VALUE -> (null,‘haha‘,1);ERROR 1048 (23000): Column ‘id‘ cannot be null报错了,id的值不能为null。
以上语句将seat为null测试
mysql> insert into student -> (id,name,seat) -> VALUE -> (1,‘haha‘,null);Query OK, 1 row affected (0.12 sec)可以插入。
所以从两个实例得出,唯一性约束允许为空值,主键是不能为空值。
再插入一条seat为null的数据
insert into student ->(id,name,seat) -> VALUE ->(2,‘abcd‘,null);Query OK, 1 row affected (0.12 sec)同样插入成功,查看一下表的数据
mysql> select * from student;+----+------+------+| id | name | seat |+----+------+------+| 1 | haha | NULL || 2 | abcd | NULL |+----+------+------+2 rows in set (0.00 sec)唯一性的空值可以重复,猜测是mysql版本的问题,有兴趣可以深入研究一下。查看mysql版本可以用version函数
mysql> select version();+------------------+| version() |+------------------+| 5.1.30-community |+------------------+一个表可以有多少个主键和唯一键?试一下将name也作为主键,用修改语句操作
mysql> alter table student modify name varchar(20) PRIMARY KEY;ERROR 1068 (42000): Multiple primary key defined报错,主键重复定义了。
那将name改为唯一性约束试试,同样使用修改语句操作
mysql> alter table student modify name varchar(20) UNIQUE;Query OK, 2 rows affected (0.23 sec)Records: 2 Duplicates: 0 Warnings: 0操作成功了,再添加一个majorId字段,也是唯一性约束,测试
mysql> alter table student add majorId int UNIQUE;Query OK, 2 rows affected (0.29 sec)Records: 2 Duplicates: 0 Warnings: 0依然成功。
所以,一张表,主键最多有一个,而唯一性键可以有多个。
是否允许组合假设两个字段组合成主键,那定义时格式:PRIMARY KEY(字段1,字段2)。在表级约束添加。
执行以下语句,将原表删除,重新建表,id和name作为主键。
drop table if EXISTS studentmysql> create table student( ->id int, ->name VARCHAR(20), -> seat int, -> PRIMARY KEY(id,name) -> );Query OK, 0 rows affected (0.16 sec)建表成功,说明主键是可以组合的,用 show index from student 语句看一下表的索引(索引的知识以后会整理)
看起来有两个主键,一个是id,一个是name。其实不然,可以插入数据测试看看。
插入两条数据,id都为1,name值不同
mysql> insert into student (id,name,seat) VALUES (1,‘haha‘,1), (1,‘john‘,2);Query OK, 2 rows affected (0.12 sec)Records: 2 Duplicates: 0 Warnings: 0可以看到数据插入成功了,再插入一条id=1,name=haha的数据试试
mysql> insert into student (id,name,seat) VALUE (1,‘haha‘,1);ERROR 1062 (23000): Duplicate entry ‘1-haha‘ for key ‘PRIMARY‘插入失败了。因为id=1并且name=haha的数据已经存在表中,不能重复插入,所以组合主键代表的还是一个主键,组合中所有列保证唯一性。
同样,唯一键也允许组合,添加格式:UNIQUE(字段1,字段2)。效果和组合主键也是一样的,不再测试了。
两者的对比就到这。总结一下,主键保证值的唯一性,不允许空值,一张表最多只能定义一个主键,允许组合,组合主键代表一个主键。唯一键也是保证值的唯一,但允许允许空值,一张表可以有多个唯一键,允许组合。
数据库设计是一个令人挠头的问题,尤其是当我们涉及到各种设置和优化时。一个常见的问题是,如果在使用 MySQL 的 InnoDB 存储引擎时没有设置自增主键,会发生什么呢?本文将深入探讨这个问题,帮助你...
2024.11.12首先写了一个小的例子:单个字段的操作这是数据库中的表:分组:select 重复字段 From 表 Group By 重复字段 Having Count(*)>1查看是否有重复的数据:GROUP BY ...
2024.11.12面临情况,用户积分变化,防止用户积分重复增加,或者重放攻击。高频访问一般采用redis来解决,重复访问一般用业务逻辑解决,mysql添加唯一约束是最后防线,一般不使用。在MySQL中可以通过以下几种方...
2024.11.15MySQL主键冲突一般是由于插入数据时已经存在相同的主键值,解决方法一般有以下几种:重新生成主键:在插入数据时,可以通过重新生成主键值的方式来避免主键冲突。例如,在主键列上使用自增长功能,让MySQL...
2024.11.14增删改查四个步骤,这里简单介绍一下删除数据。在MySQL中,可以使用delete语句来删除表的一行或者多行数据。语法格式为:delete FROM [WHERE 子句][ORDER BY 子句][L...
2024.11.13