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 主键的更多相关文章

  1. MySql -- primary key主键约束

    4.primary key主键约束 在一张表中: 1) 主键约束是 NOT NULL.UNIQUE唯一的记录. 2) 主键约束必须是唯一的值. 3) 主键约束列不能包含 NULL 值. 注意:每个表都 ...

  2. FOREIGN KEY 外键约束; UNIQUE和PRIMARY KEY 主键约束、CREATE INDEX建立索引的使用

    1)foreign key 是个约束,意思是说如果你给A字段设置了外键约束,以后你要往A字段插入数据,这个数据一定是要在foreign key 后面跟的那个字段中存在的值.这个的意义就是约束了数据的完 ...

  3. 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK

    如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...

  4. MySQL为什么需要一个主键

    主键 表中每一行都应该有可以唯一标识自己的一列(或一组列). 一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID 或 雇员社会保险号. 主键(primary key) 一列(或一 ...

  5. (转)MyBatis+MySQL 返回插入的主键ID

    MyBatis+MySQL 返回插入的主键ID 需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如 ...

  6. mybatis+mysql返回插入的主键,参数只是提供部分参数

    mybatis+mysql返回插入的主键,参数只是提供部分参数 <insert id="insertByChannelIdOpenid" useGeneratedKeys=& ...

  7. JDBC 复习5 mysql 的自增长主键 auto_increment

    MySQL 自增长主键 (1)如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号.编号从1开始,并1为基数递增. (2)把0插入AUTO_INCRE ...

  8. MYSQL获取自增主键【4种方法】

    通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键.本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值: 通过JDBC2.0提 ...

  9. Mysql对自增主键ID进行重新排序

    Mysql数据库表的自增主键ID号经过一段时间的添加与删除之后乱了,需要重新排列. 原理:删除原有的自增ID,重新建立新的自增ID. 1,删除原有主键: ALTER TABLE `table_name ...

随机推荐

  1. Oracle查询优化--单表查询

    --查询所有 select * from emp; select * from emp where comm is null; --错误表达 --select * from emp where com ...

  2. MyEclipse安装EGit插件方法

    摘要: 先了解自己的MyEclipse是基于哪个版本的Eclipse优化的,然后到EGit网站找对应的EGit版本,下载压缩包,解压安装. 在网上看到有人说并不是任意版本的EGit插件都能适配你的My ...

  3. CString TCHAR互相转换

    CString->TCHAR*的转化可以用函数GetBuffer() // 原型:LPTSTR GetBuffer( int nMinBufLength ); CString str(_T(&q ...

  4. layui时间,table,大图查看,弹出框,获取音频长度,文件上传

    1.引入: <link href="../../Scripts/layui-v2.3.0/css/layui.css" rel="stylesheet" ...

  5. Android中文API

    Android中文API http://www.android-doc.com/index.html

  6. Java中自己定义缓存方式

    说说自己在开发中经常用到的写法. /** * 数据缓存 * @author * */public class DataCache {    /** 对象缓存*/    public static Ma ...

  7. ScrollView拉到尽头时出现阴影的解决方法

    <code class="hljs markdown has-numbering" style="display: block; padding: 0px; col ...

  8. Mysql全文搜索match against的用法

    全文检索在 MySQL 中就是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE ...

  9. 调试寄存器 原理与使用:DR0-DR7

    调试寄存器 原理与使用:DR0-DR7 下面介绍的知识性信息来自intel IA-32手册(可以在intel的开发手册或者官方网站查到),提示和补充来自学习调试器实现时的总结. 希望能给你带去有用的信 ...

  10. openstack将本地实例迁移至ceph存储中

    需求: 最近在openstack上线了ceph存储,创建虚拟机和云硬盘都基于ceph卷进行存储和创建,但是之前openstack用的是本地存储,创建的所有实例都在本地文件中,当实例重启之后,opens ...