mysql 约束条件 primary key 主键
primary key字段的值不为空且唯一
约束:not null unique
存储引擎:innodb
对于innodb来说,一张表内必须有一个主键
单列做主键
多列做主键(复合主键)
通常都是id字段 设置主键
单列主键
mysql> create table t17(id int primary key,name char(16));
Query OK, 0 rows affected (0.01 sec) mysql> desc t17;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(16) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
验证 重复了
primary 相当于 unique
mysql> insert into t17 values(1,'mike'),(2,'jack');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from t17;
+----+------+
| id | name |
+----+------+
| 1 | mike |
| 2 | jack |
+----+------+
2 rows in set (0.00 sec) mysql> insert into t17 values(2,'ben');
ERROR 1062 (23000): Duplicate entry '' for key 'PRIMARY'
只传name字段,没有传id
默认有个 default id 设置0 不为空
mysql> insert into t17(name) values('ben');
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from t17;
+----+------+
| id | name |
+----+------+
| 0 | ben |
| 1 | mike |
| 2 | jack |
+----+------+
3 rows in set (0.00 sec)
再插入一次 id 0 重复了
mysql> insert into t17(name) values('tom');
ERROR 1062 (23000): Duplicate entry '' for key 'PRIMARY
总结:如果不设置主键 ,mysql的存储引擎又是innodb ,mysql会找一个字段设置为主键
会找一个不为空not null 且唯一的字段 unique 设置为主键 primary key,
如果都没有找到,整张表扫描完以后,所有字段都找不到一个符合条件的字段, 会找一个字段 设置一个隐藏的主键
mysql是innodb,建立一张表,应该自己建立一个主键。
创建一张表 id字段 设置not null unique,不设置主键
为主键了id
mysql> create table t18(id int not null unique,name varchar(16));
Query OK, 0 rows affected (0.01 sec) mysql> desc t18;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(16) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
在所有字段后单独定义primary key
mysql> create table department3(id int,name varchar(16),primary key(name));
Query OK, 0 rows affected (0.01 sec) mysql> desc department3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(16) | NO | PRI | | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> create table department4(id int,name varchar(16),constraint primary key(name));
Query OK, 0 rows affected (0.01 sec) mysql> desc department4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(16) | NO | PRI | | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
==================多列做主键================
复合主键,就是多个字段联合唯一
primary key(ip,port)
mysql> create table t19(ip varchar(16),port char(16),primary key(ip,port));
Query OK, 0 rows affected (0.02 sec) mysql> desc t19;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| ip | varchar(16) | NO | PRI | | |
| port | char(16) | NO | PRI | | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
要求ip相同 端口不同
mysql> insert into t19 values('192.168.1.1',80),('192.168.1.1',81);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from t19;
+-------------+------+
| ip | port |
+-------------+------+
| 192.168.1.1 | 80 |
| 192.168.1.1 | 81 |
+-------------+------+
2 rows in set (0.00 sec) mysql> insert into t19 values('192.168.1.1',81);
ERROR 1062 (23000): Duplicate entry '192.168.1.1-81' for key 'PRIMARY'
mysql 约束条件 primary key 主键的更多相关文章
- MySql -- primary key主键约束
4.primary key主键约束 在一张表中: 1) 主键约束是 NOT NULL.UNIQUE唯一的记录. 2) 主键约束必须是唯一的值. 3) 主键约束列不能包含 NULL 值. 注意:每个表都 ...
- FOREIGN KEY 外键约束; UNIQUE和PRIMARY KEY 主键约束、CREATE INDEX建立索引的使用
1)foreign key 是个约束,意思是说如果你给A字段设置了外键约束,以后你要往A字段插入数据,这个数据一定是要在foreign key 后面跟的那个字段中存在的值.这个的意义就是约束了数据的完 ...
- 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK
如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...
- MySQL为什么需要一个主键
主键 表中每一行都应该有可以唯一标识自己的一列(或一组列). 一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID 或 雇员社会保险号. 主键(primary key) 一列(或一 ...
- (转)MyBatis+MySQL 返回插入的主键ID
MyBatis+MySQL 返回插入的主键ID 需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如 ...
- mybatis+mysql返回插入的主键,参数只是提供部分参数
mybatis+mysql返回插入的主键,参数只是提供部分参数 <insert id="insertByChannelIdOpenid" useGeneratedKeys=& ...
- JDBC 复习5 mysql 的自增长主键 auto_increment
MySQL 自增长主键 (1)如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号.编号从1开始,并1为基数递增. (2)把0插入AUTO_INCRE ...
- MYSQL获取自增主键【4种方法】
通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键.本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值: 通过JDBC2.0提 ...
- Mysql对自增主键ID进行重新排序
Mysql数据库表的自增主键ID号经过一段时间的添加与删除之后乱了,需要重新排列. 原理:删除原有的自增ID,重新建立新的自增ID. 1,删除原有主键: ALTER TABLE `table_name ...
随机推荐
- NPOI从数据库中调取数据直接导出到EXCEL中
关于NPOI NPOI是POI项目的.NET版本,是由@Tony Qu(http://tonyqus.cnblogs.com/)等大侠基于POI开发的,可以从http://npoi.codeplex. ...
- 彩色图像的直方图均衡化matlab代码
彩色图像的直方图均衡化 - YangYudong2014的专栏 - CSDN博客 http://blog.csdn.net/yangyudong2014/article/details/4051503 ...
- java util.Date和sql.Date转换(时区转换)
public static Timestamp zoneTtime(String time) throws Exception{ time= "2018-08-01T10:01:21.905 ...
- VS2008 Output窗口自动滚动
Output窗口默认是自动滚动的,活动光标始终处于最后一行. 但是有时候因为某些操作可能导致Output窗口的自动滚动停止. 如何恢复自动滚动呢? 使用快捷键操作即可:Ctrl + End
- wamp下修改mysql root用户的登录密码方法
wamp环境安装之后mysql的root密码为空的,我们希望给它设置一个密码; 1.安装好wamp后,运行WampServer程序,进入MYSQL控制台: 2.进入控制台后,提示输入密码(不用输入任何 ...
- C#操作MSMQ示例
C#操作MSMQ示例,示例代码: using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- Hbase的基本认识
1.使用场景:实时查询交互 说说概念性的东西,方便今后更加深入的理解. HBase是Apache Hadoop中的一个子项目,Hbase依托于Hadoop的HDFS作为最基本存储基础单元,通过使用ha ...
- 用gcc编译成可执行程序 (转)
#gcc hello.c 该命令将hello.c直接生成最终二进制可执行程序a.out 这条命令隐含执行了(1)预处理.(2)汇编.(3)编译并(4)链接形成最终的二进制可执行程序.这里未指定输出文件 ...
- 使用Node.js完成路由
首先先看一下文件的结构: 我想通过改变不同的路由进不同的页面, 先看这几个HTML页面: 404: <!DOCTYPE html> <html lang="en" ...
- jQuery中的$.each的用法
$.each(Array,function(i,value){ this; //this指向当前对象 i; //i表示当前下标 value; //value表示当前元素 })