(2.10)Mysql之SQL基础——约束及主键重复处理

关键词:mysql约束,批量插入数据主键冲突

【1】查看索引: show index from table_name;  

【2】查看有约束的列:select * from information_schema.key_column_usage where table_schema= 'db_name' and table_name = 'table_name';

【3】查看有约束的表及表约束类型:select * from information_schema.table_constraints where table_schema= 'db_name' and table_name = 'table_name';

【4】查看外键约束:select * from information_schema.referential_constraints where constraint_schema='test1' and table_name='yg';

1.概念

mysql中约束有五种:

  【1】非空约束(not null):列值不能为空

  【2】唯一约束(unique):列值都是唯一的,可以有Null(可以有多个Null)

  【3】主键约束(primariy):用于唯一的表示表行的数据,列值不能重复,不能为空。(每个表只能有一个主键)

  【4】外键约束(foreign key):表与表的依赖关系,外键列数据必须要在主表的主键列中存在,或者为Null。

  【5】检查约束、条件约束(check):强制列值数据必须满足定义的条件。如设定值为10-20,不在范围内的报错。

  【6】默认约束(default value):默认值为多少,可以用default 来获取。如insert into test101 values(default,1);

    修改默认约束:alter table users_info alter column role_id set default 1;

注意:

  【1】NOT NULL约束只能在列级定义

  【2】作用在多个列上的约束只能定义在表级别,例如复合索引。

  【3】列级别上不能定义外键约束,并且不能给约束起名字,由mysql自动命名(NOT NULL除外)

  【4】表级别上定义的约束可以给约束起名字(check约束除外,会自动命名)

2.一般形式使用(建表时与非建表时)

3、主键的使用

  (3.1)有主键的表,在批量插入数据时有主键冲突怎么处理?

    【1】ignore:忽略  【2】replace:替换  【3】 on duplicate key update:有重复插入时更新原表重复Key所在行的值

  (3.2)有重复值,没有主键,要加主键怎么处理?

    【1】重复数据时没有用的,可以清除掉,再加主键。

    【2】找出重复的数据,修改重复的数据行,再加主键;

    【3】直接新增一个id列,加auto_increment primary key 。(相当于构建一个row_number,但是该方法会修改结构)

       或者用row_number选出重复的插入新表  

4.外键的基本形式

 基本形式(建表时创建请看2) 

  foreign key(本表的外键字段) references 主表名(关联字段)【主记录删除时 on delete/ 更新时 on update】

  如果指定了 on delete/ on update 还有几个选择

  cascade:级联操作,主表更新从表也更新(主键值),主表删除从表也删除

  set null:设置Null,主表更新从表设置为null(主键值),主表删除从表也设置null(列属性不是not null)

  restrict:拒绝附表删除和更新。

  no action:标准的SQL关键字,痛restrict

  

2.一般形式使用(select * from information_schema.table_constraints where table_name = 'test1012')

  

约束定义的语法:

列级别:
CREATE TABLE table_name(column_name data_type
  [ [NOT NULL] | [UNIQUE [KEY] | PRIMARY KEY]
  |CHECK(expr)],…) 表级别:
CREATE TABLE table_name(
  column_name data_type [NOT NULL],
  column_name data_type [not null],…,
  [CONSTRAINT constraint_name] PRIMARY KEY (col_name,...)
  |[CONSTRAINT constraint_name] unique (col_name,...)
  |[CONSTRAINT constraint_name] foreign KEY (col_name) REFERENCES tbl_name (index_col_name)
  |check(expr) 演示:

  【1】建表时定义约束(列级)

  create table test1014(

    id int primary key auto_increment, --主键约束

    num1 int unique, --唯一约束

    num2 int default 10, --默认约束

    num3 int not null, --非空约束

    num4 int check(num4>0) --check约束

  )

  【2】建表时定义约束(表级)

 create table emp(
id int,
name varchar(20),
deptid int,
constraint emp_id_pk primary key(id), --主键
constraint emp_deptid_fk foreign key(deptid) references dept(deptid)--外键
 ); 

 【3】使用alter table  或者   drop index 增加、删除约束
  1)删除索引/删除约束
    <1>DROP INDEX index_name ON tbl_name
    <2>ALTER TABLE tbl_name DROP INDEX index_name
    
  2)添加索引,添加约束
    <1>alter table test add key_type(column);  --alter table test add primary key(test_no);
    <2>create unique index UK_student_name on student (name);
    <3>alter table student add constraint uk_student_name unique (name);
    <4>外键:ALTER TABLE tblActivationRecords ADD CONSTRAINT fk_Activation_License FOREIGN KEY (LicenseID) REFERENCES tblLicenses(ID)

   

3、主键的使用

  基本形式(建表时创建请看2)

-- 其他形式
1)增加/删除主键  
    <1>增加:alter table table_name add primariy key(column) or  <3>alter table student add constraint uk_student_name unique (name);
    <2>删除:alter table table_name drop primary key;

(3.1)有主键的表,在批量插入数据时有主键冲突怎么处理?

  【1】-- ignore(忽略):自动忽略重复的记录行,不影响后面的记录插入;

    insert ignore into test101(id , num1) values(1,2),(2,3) ,(1,3)     -- 这样插入也是从左到右顺序插入,所以 (1,3)后插入,又由于id为主键,所以和(1,2)行所在主键冲突,被忽略;

  【2】-- replace(替换):后插入的相同重复主键会替换之前已存在的数据;

    replace  into test101(id , num1) values(1,2),(2,3) ,(1,3)

  【3】-- on duplicate key update:先执行insert 操作再根据主键执行对表中已有值进行update操作

    insert into test101 values(1,11),(2,22) ;

    insert into test101 values(1,100),(2,100) on duplicate key update num1=num1+100;

    结果如下:

      

(3.2)有重复值,没有主键,要加主键怎么处理?

  【1】重复数据时没有用的,可以清除掉,再加主键。

    解决办法:(1)查出没有重复的记录, select id,max(num1) from test102 group by id having count(id)>=1;

         (2)再创建一个新表把不重复的记录插入进去

         (3)再将原表与新表名称互换

         (4)加主键

  

  【2】找出重复的数据,修改重复的数据行,再加主键;

     直接根据值修改,或者用变量构造row_number修改,甚至构造row_number() over(partition by) 来修改(参考:mysql实现开窗函数、Mysql实现分析函数

  【3】直接新增一个id列,加auto_increment primary key 。(相当于构建一个row_number,但是该方法会修改结构)

     也可以直接把所有数据插入到一个新的有自增列主键的表中去,然后再进行相关改名即可。

4.外键的基本形式

  基本形式(建表时创建请看2)

  

-- 基本演示

-- 部门表
create table bm(
b_id int primary key auto_increment,
b_name varchar(30) not null
) character set utf8 comment '部门信息表'; -- 员工表
create table yg(
y_id int primary key auto_increment,
y_name varchar(30) not null,
b_id int,
constraint FK_yg_b_id foreign key (b_id) references bm(b_id)
) character set utf8 comment '员工信息表';
ALTER TABLE yg ADD CONSTRAINT fk_yg_b_id FOREIGN KEY (b_id) REFERENCES bm(b_id);
--依赖关系说明
【1】必须部门表中有数据,员工表中的b_id字段才能插入数据。
   且员工表中的b_id值必须是部门表中的b_id(如果不涉及该列的插入则不影响)

  foreign key(本表的外键字段) references 主表名(关联字段)【主记录删除时 on delete/ 更新时 on update】

  如果指定了 on delete/ on update 还有几个选择

  cascade:级联操作,主表更新从表也更新(主键值),主表删除从表也删除

  set null:设置Null,主表更新从表设置为null(主键值),主表删除从表也设置null(列属性不是not null)

  restrict:拒绝附表删除和更新。

  no action:标准的SQL关键字,痛restrict

演示:

  

-- 部门表
create table bm(
b_id int primary key auto_increment,
b_name varchar(30) not null
) character set utf8 comment '部门信息表'; -- 员工表
create table yg(
y_id int primary key auto_increment,
y_name varchar(30) not null,
b_id int,
constraint FK_yg_b_id foreign key (b_id) references bm(b_id) on delete cascade
) character set utf8 comment '员工信息表'; 父表:bm(部门表) 子表:yg(员工表) --级联 cascade
【1】级联删除:部门表删除了b_id值,对应员工表的b_id值所在行也会被删除。
【2】级联更新:部门表修改了b_id的值,那么员工表对应的b_id值也会被更新。 --置空 set null
alter table yg drop foreign key fk_yg_b_id;
alter table yg add foreign key (b_id) references bm(b_id) on delete set null;
【1】置空删除:部门表删除了b_id值,对应员工表的b_id值会被赋值null。
【2】置空更新:部门表更新了b_id值,对应员工表的b_id值会被赋值null。 --拒绝父表删除和更新 restrict(只要子表有记录是不让删除父表的记录值得)
alter table yg drop foreign key fk_yg_b_id;
alter table yg add foreign key (b_id) references bm(b_id) on delete restrict;
【1】拒绝父表删除:在子表(员工表)中存在的b_id值时,父表中b_id不允许删除
【1】拒绝父表更新:在子表(员工表)中存在的b_id值时,父表中b_id不允许更新 -- 推荐级联删除,拒绝父表更新
alter table yg drop foreign key fk_yg_b_id;
alter table yg add foreign key (b_id) references bm(b_id) on delete cascade on update restrict;

(2.10)Mysql之SQL基础——约束及主键重复处理的更多相关文章

  1. mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

    [CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...

  2. (2.16)Mysql之SQL基础——函数

    (2.16)Mysql之SQL基础——函数 关键词:mysql函数,mysql自定义函数,mysql聚合函数,mysql字符串函数,mysql数值函数 1.自定义函数 -- (1)一般形式 creat ...

  3. (2.15)Mysql之SQL基础——开发设计最佳规范

    (2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...

  4. (2.11)Mysql之SQL基础——存储过程与变量

    (2.11)Mysql之SQL基础——存储过程 关键字:mysql存储过程 查看存储过程: []SELECT * FROM information_schema.ROUTINES WHERE ROUT ...

  5. (2.8)Mysql之SQL基础——索引的分类与使用

    (2.8)Mysql之SQL基础——索引的分类与使用 关键字:mysql索引,mysql增加索引,mysql修改索引,mysql删除索引 按逻辑分类: 1.主键索引(聚集索引)(也是唯一索引,不允许有 ...

  6. (2.7)Mysql之SQL基础——表的操作与查看

    (2.7)Mysql之SQL基础——表的操作与查看 搜索关键字:mysql表操作,comment注释操作,mysql临时表 0.临时表 create temporary table 1.创建表(在in ...

  7. (2.5)Mysql之SQL基础——数据类型

    (2.5)Mysql之SQL基础——数据类型 关键词:mysql数据类型 目录: 一.整数型 二.小数型(以下均不能使用无符号) 三.日期时间型 四.字符串型 一.整数型 额外参数示例: int [( ...

  8. SQL基础-约束&索引

    一.约束 1.约束简介 约束(constraint): 表中数据的限制条件. 完整性 有效性 约束的种类: 主键约束 外键约束 唯一约束 检查约束 非空约束 2.主键约束 主键约束: 唯一标识表中每一 ...

  9. (2.14)Mysql之SQL基础——游标

    (2.14)Mysql之SQL基础——游标 关键词:Mysql游标 -- (1)定义游标 declare cur_name cursor for select * from table_name wh ...

随机推荐

  1. 基于.Net实现前端对话框和消息框

    关于前端对话框.消息框的优秀插件多不胜数.造轮子是为了更好的使用轮子,并不是说自己造的轮子肯定好.所以,这个博客系统基本上都是自己实现的,包括日志记录.响应式布局等等一些本可以使用插件的.好了,废话不 ...

  2. error C2065: “m_Pic”: 未声明的标识符

    public: CPicture m_Pic; 要写在头文件里! 而不能是cpp文件的public里!

  3. Linux中的SELinux详解--16

    SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled)  几种模式之间的转换 在CentOS6.2 中安装intel 的c++和fortran 的编 ...

  4. 工具类之数据库工具类:DBUtil(採用反射机制)

    常常操作数据库的码农们一定知道操作数据库是一项非常复杂的工作.它不仅要解决各种乱码的问题还要解决各种数据表的增删改查等的操作. 另外每次操作数据库都要用到数据库连接.运行SQL语句.关闭连接的操作.所 ...

  5. POJ 3093 Margaritas(Kind of wine) on the River Walk (背包方案统计)

    题目 Description One of the more popular activities in San Antonio is to enjoy margaritas in the park ...

  6. ios 调用系统应用的方法 应用间跳转的方法

    声明一个私有方法: #pragma mark - 私有方法 -(void)openUrl:(NSString *)urlStr{ //注意url中包含协议名称,iOS根据协议确定调用哪个应用,例如发送 ...

  7. 【RF库Collections测试】Get From Dictionary

    Name:Get From DictionarySource:Collections <test library>Arguments:[ dictionary | key ]Returns ...

  8. Keil MDK从未有过的详细使用讲解(转)

    这博主关于MDK 的使用的文章,写的得TM的好  TM的实用! 真心收藏! 熟悉Keil C 51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论 ...

  9. Spring学习笔记--构造器注入

    之前讲到的名为"duke"的bean有一个私有成员变量beanBags代表这个杂技师bean的一次性能够抛出的最多的数量,Juggler有一个构造函数,构造函数的第一个参数(这里只 ...

  10. Android 按钮 Button和ImageButton

    Button -- 按钮ImageButton -- 图片按钮Button和ImageButton特征1.共有的特征都可以作为一个按钮产生点击事件2.不同点: (1)Button有text属性,Ima ...