精华内容
下载资源
问答
  • oracle约束控制

    2020-08-25 16:42:03
    UNIQUE 唯一 唯一和not null 不冲突 可以多个值为null 但是不能重复 PRIMARY KEY 主键 FOREIGN KEY 外键 CHECK 检查条件 */ /** 注意事项: 1.如果不指定约束名称 则默认按照SYS_Cn的格式指定约束名称 2.创建...
    /**
    	约束是 表级的强制规定
    	有以下五种约束:
    	NOT NULL 不为空
    	UNIQUE	唯一 唯一和not null 不冲突  可以多个值为null 但是不能重复
    	PRIMARY KEY 主键
    	FOREIGN KEY 外键
    	CHECK 检查条件
    */
    
    /**
    	注意事项:
      1.如果不指定约束名称 则默认按照SYS_Cn的格式指定约束名称
    	2.创建和修改约束:
    		- 建表的同事
    		- 建表之后
    	3.可以在表级或列级定义约束
    	4.可以通过数据字典视图查看约束
    */
    
    -- 创建列级约束
    create table emp2(
    	id number(10) constraint emp2_id_nn not null, -- constraint 约束(给约束起个名称)
    	name varchar2(10) not null,-- 使用约束默认名称 SYS_Cn
    	salary number(10,2)
    )
    
    
    select * from emp2;
    
    --ORA-01400: cannot insert NULL into ("SCOTT"."EMP2"."NAME") 因为有了约束
    INSERT INTO emp2 VALUES(1001,null,2000);
    
    
    CREATE TABLE emp3(
    	-- 列级约束
    	id number(10) constraint emp3_id_uk UNIQUE, -- 唯一
    	name VARCHAR2(10) constraint emp3_name_nn not null, --不为空
    	email VARCHAR2(20),
    	salary number(10,2),
    	--表级约束
    	constraint emp3_email_uk UNIQUE(email)
    )
    
    
    INSERT INTO emp3 values(1001,'aa','aa@126.com',2000)
    
    -- unique constraint (SCOTT.EMP3_ID_UK) violated id重复 不唯一
    INSERT INTO emp3 values(1001,'aa','aa1@126.com',2000)
    --  ORA-00001: unique constraint (SCOTT.EMP3_EMAIL_UK) violated email 重复 不唯一
    INSERT INTO emp3 values(1002,'aa','aa@126.com',2000)
    
    
    CREATE TABLE emp4(
    	-- 列级约束
    	id number(10) constraint emp4_id_pk primary key, -- 唯一 不为空
    	name VARCHAR2(10) constraint emp4_name_nn not null, --不为空
    	email VARCHAR2(20),
    	salary number(10,2),
    	--表级约束
    	constraint emp4_email_uk UNIQUE(email)
    )
    
    -- > ORA-01400: cannot insert NULL into ("SCOTT"."EMP4"."ID") 主键不能为空
    INSERT INTO emp4 VALUES(null,'aa','aa@126.com',2000)
    INSERT INTO emp4 VALUES(1001,'aa','aa@126.com',2000)
    
    -- > ORA-00001: unique constraint (SCOTT.EMP4_ID_PK) violated  主键不能重复
    INSERT INTO emp4 VALUES(1001,'bb','bb@126.com',2000)
    
    
    
    CREATE TABLE emp5(
    	-- 列级约束
    	id number(10), -- 唯一 不为空
    	name VARCHAR2(10) constraint emp5_name_nn not null, --不为空
    	email VARCHAR2(20),
    	salary number(10,2),
    	--表级约束
    	constraint emp5_email_uk UNIQUE(email),
    	constraint emp5_id_pk primary key(id)
    )
    
    
    
    -- 外键 儿子 主键 爹  类似一个继承关系 儿子继承父亲List 但是 儿子不能改变这个List,只能从该List中选择一个元素
    CREATE TABLE emp6(
    	-- 列级约束
    	id number(10), -- 唯一 不为空
    	name VARCHAR2(10) constraint emp6_name_nn not null, --不为空
    	email VARCHAR2(20),
    	salary number(10,2),
    	department_id number(10),
    	--表级约束
    	constraint emp6_email_uk UNIQUE(email),
    	constraint emp6_id_pk primary key(id),
    	--  foreign key (department_id)  该表的外键  是 department_id 关联 DEPARTMENTS 表的主键 DEPARTMENT_ID
    	constraint emp6_dpmk_fk foreign key (department_id) references DEPARTMENTS(DEPARTMENT_ID)
    )
    
    -- 作用 插入数据时  外键与主键关联字段   如果主键 没有100字段 而外键插入100 就会违反约束
    -- 简而言之 外键插入的数据 必须是主键拥有的值
    -- 例 外键插入2000 而主键所对应表中没有 2000 字段 顾报错 ORA-02291  parent key not found
    
    -- > ORA-02291: integrity constraint (SCOTT.EMP6_DPMK_FK) violated - parent key not found
    INSERT INTO emp6 VALUES(1001,'aa','aa@123.com',2000,2000)
    
    
    -- ON DELETE CASCADE (级联删除) 父亲的List没了  儿子的List也没了,列直接没了 儿子是继承自父亲的
    -- ON DELETE SET NULL (级联置空) 父亲的List没了 儿子的List的值就为NULL,列还在值没了
    
    -- 级联置空
    CREATE TABLE emp7(
    	-- 列级约束
    	id number(10), -- 唯一 不为空
    	name VARCHAR2(10) constraint emp7_name_nn not null, --不为空
    	email VARCHAR2(20),
    	salary number(10,2),
    	department_id number(10),
    	--表级约束
    	constraint emp7_email_uk UNIQUE(email),
    	constraint emp7_id_pk primary key(id),
    	--  foreign key (department_id)  该表的外键  是 department_id 关联 DEPARTMENTS 表的主键 DEPARTMENT_ID
    	constraint emp7_dpmk_fk foreign key (department_id) references DEPARTMENTS(DEPARTMENT_ID) on DELETE SET NULL 
    )
    
    -- check约束 相当于自定义约束
    -- 工资不能低于500 不能高于30000
    
    CREATE TABLE emp8(
    	-- 列级约束
    	id number(10), -- 唯一 不为空
    	name VARCHAR2(10) constraint emp8_name_nn not null, --不为空
    	email VARCHAR2(20),
    	salary number(10,2) check(salary > 500 and salary < 30000),
    	department_id number(10),
    	--表级约束
    	constraint emp8_email_uk UNIQUE(email),
    	constraint emp8_id_pk primary key(id),
    	--  foreign key (department_id)  该表的外键  是 department_id 关联 DEPARTMENTS 表的主键 DEPARTMENT_ID
    	constraint emp8_dpmk_fk foreign key (department_id) references DEPARTMENTS(DEPARTMENT_ID) ON DELETE CASCADE
    )
    
    -- ORA-02290: check constraint (SCOTT.SYS_C0012098) violated   自定义约束工资低于500 了
    INSERT INTO emp8 VALUES(1001,'aa','a@123.com',400,20)
    
    /**
    	建表之后:
    	添加或修改约束
    	1. 添加或删除约束,但是不能修改约束
    	2. 有效化或无效化约束
    	3. 添加 not null 约束要使用 modify语句
    */
    
    -- 添加约束
    ALTER TABLE emp5 
    MODIFY (salary number(10,2) not null)
    
    -- 删除约束
    ALTER TABLE emp5
    drop constraint EMP5_NAME_NN
    
    ALTER TABLE emp5
    DROP constraint SYS_C0012102
    
    -- 添加约束
    
    ALTER TABLE emp5 
    ADD constraint emp5_name_uk UNIQUE(name)
    
    -- 无效化约束
    
    SELECT * from emp3
    -- > ORA-00001: unique constraint (SCOTT.EMP3_EMAIL_UK) violated
    INSERT INTO emp3 VALUES(1002,'bb','aa@126.com',2000)
    -- 使SCOTT.EMP3_EMAIL_UK 唯一约束无效化
    
    ALTER TABLE emp3
    disable constraint EMP3_EMAIL_UK
    
    -- SCOTT.EMP3_EMAIL_UK有效化
    -- ORA-02299: cannot validate (SCOTT.EMP3_EMAIL_UK) - duplicate keys found 
    -- 设置该列唯一约束 但是该列有重复的值
    DELETE FROM EMP3 WHERE id = 1002 --删了之后就好了
    ALTER TABLE emp3
    enable constraint EMP3_EMAIL_UK
    
    
    
    -- 练习
    
    60. 约束需要注意的地方
    
    	1). ** 非空约束只能定义在列级
    
    	2). ** 唯一约束的列值可以为空
    
    	3). ** 外键引用的列起码要有一个唯一约束	;
    
    
    
    
    展开全文
  • 一、约束 1、列级约束 #常见约束 /* NOT NULL:非空 该字段的值是必填的,如果不设置该约束,该字段默认是...UNIQUE:唯一约束 该字段值不可以重复 1、可以为空 2、一个表中可以有多个唯一键,可以有组合唯一键 FOREIG

    一、约束
    1、列级约束
    #常见约束
    /*
    NOT NULL:非空
    该字段的值是必填的,如果不设置该约束,该字段默认是可以为空
    DEFAULT:默认
    该字段有默认值
    CHECK:检查,mysql语法支持,但效果不支持
    该字段值可以加以限制,比如年龄可以控制在0-120之间

    PRIMARY KEY:主键
    该字段值不可以重复
    1、不可以为空
    2、一个表中只能有一个主键,但是可以多个字段做组合主键
    UNIQUE:唯一约束
    该字段值不可以重复
    1、可以为空
    2、一个表中可以有多个唯一键,可以有组合唯一键
    FOREIGN KEY:外键
    用于限制多表的关系
    1、从表的该字段值必须来自于主表的关联列的值
    2、从表和主表的关联列的类型必须一样
    3、主表的关联列必须是主键
    4、在从表中设置外键
    5、一个表中可以添加多个外键
    6、插入数据时,先插入主表
    删除数据时,先删除从表

    分类:
    位置 支持
    列级约束 列的后面 除了外键
    表级约束 表的后面 除了非空和默认

    #CREATE TABLE 表名(
    字段名 字段类型 列级约束,
    字段名 字段类型 列级约束,
    表级约束

    2、表级约束
    #添加表级约束
    #语法
    CREATE TABLE stuinfo(
    id INT ,
    stuName VARCHAR(20),
    gender CHAR,
    age INT UNSIGNED,
    【CONSTRAINT 约束名】约束类型(字段)
    );

    3、修改表时添加约束
    #1.添加非空
    ALTER TABLE stuinfo MODIFY COLUMN gender CHAR NOT NULL;

    #2.添加默认
    ALTER TABLE stuinfo MODIFY COLUMN age INT UNSIGNED DEFAULT 18;

    #3.添加主键
    #①方式一:列级约束的做法
    ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;

    #②方式二:表级约束的做法
    #语法:
    #ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型 (字段);

    4、修改表时删除约束
    #1.删除非空
    ALTER TABLE stuinfo MODIFY COLUMN gender CHAR ;

    #2.删除默认
    ALTER TABLE stuinfo MODIFY COLUMN age INT UNSIGNED;

    #3.删除主键
    ALTER TABLE stuinfo MODIFY COLUMN id INT ;
    ALTER TABLE stuinfo DROP PRIMARY KEY;

    #4.删除唯一
    ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20);
    ALTER TABLE stuinfo DROP INDEX uq_stuinfo;

    #查看指定表的所有索引
    SHOW INDEX FROM stuinfo;

    #5.删除外键
    ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_grade;

    二、事物概念
    1、事务的概念
    事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。

    事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

    为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。

    2、事务的特点
    事务的ACID(acid)属性
    (1) 原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

    (2)一致性(Consistency)
    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

    (3)隔离性(Isolation)
    事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

    (4)持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

    3、事物的使用

    以第一个 DML 语句的执行作为开始
    以下面的其中之一作为结束:
    COMMIT 或 ROLLBACK 语句
    DDL 或 DCL 语句(自动提交)
    用户会话正常结束
    系统异常终了

    SET autocommit=0;#取消自动提交
    START TRANSACTION;#开启事务
    ROLLBACK;#回滚事务
    COMMIT;#提交事务

    4、数据库的隔离级别
    (1)对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:

    脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.

    不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.

    幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

    (2)数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.

    (3)一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱.

    5、数据库提供的 4 种事务隔离级别

    Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ COMMITED
    Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ

    6、在 MySql 中设置隔离级别
    (1)每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别

    (2)查看当前的隔离级别: SELECT @@tx_isolation;

    (3)设置当前 mySQL 连接的隔离级别:
    set transaction isolation level read committed;

    (4)设置数据库系统的全局的隔离级别:
    set global transaction isolation level read committed;

    三、事物实操
    1、事物-sql
    概念:数据库区分于其他文件系统的一种特征
    好处:
    希望执行一些操作时,要么同时执行,要么同时不执行,最终达到数据的一致性
    特性:【★】
    ACID
    分类:
    1、隐式事务
    比如:insert、update、delete本身就是一个事务
    2、显式事务
    特征:具有明显的开启和结束的标记
    set autocommit=0; 取消隐式事务自动提交的功能
    start transaction;开启事务
    …增删改查sql语句
    commit;提交事务
    rollback;回滚事务

    并发事务容易出现的问题:
    脏读:一个事务读到了另一个事务未提交的数据
    不可重复读:在一个事务执行期间,两次查询读到的结果不一致
    幻读:一个事务进行插入操作,没有提交。另一个事务读到了没有提交的数据

    如何解决?
    read uncommitted: 脏读、不可重复、幻读
    read committed:不可重复读、幻读
    repeatable read:幻读(mysql5.5版本之前会出现幻读,但5.5之后不会出现)
    serializable:串行化(性能极低)
    mysql默认的是repeatable read

    如何查看隔离级别?
    select @@tx_isolation;
    如何设置隔离级别?
    set @@tx_isolation=‘read-uncommitted’;
    set [global] transaction isolation level read uncommitted;
    */

    SHOW VARIABLES LIKE ‘autocommit’;

    #开启事务
    SET autocommit=0;#取消自动提交
    START TRANSACTION;#开启新事务,可选
    INSERT INTO beauty VALUES(NULL,‘付明明2’,‘女’,NOW(),‘112’,NULL,NULL);

    ROLLBACK;#回滚事务
    COMMIT;#提交事务

    SELECT * FROM beauty;

    #演示delete和truncate在事务中的区别
    delete可以回滚, truncate不能回滚

    2、并发事物 dos 演示

    SELECT * FROM admin
    INSERT INTO admin VALUES(1,‘xiaoming’,‘000000’)

    dos1
    mysql -uroot -proot
    mysql > use test;
    mysql> set autocommit = 0;
    mysql> insert into account values(11,’john’,’000’)
    mysql>commit
    mysq> set transaction isolation level read uncommitted; //最小的隔离级别 //没有效果需要重启dos
    mysql> set autocommit = 0;
    mysql > insert into account values(11,’jhok,’8989’’)

    dos2
    mysql -uroot -proot
    mysql > use test;
    mysql > select @@tx_isolation
    SERIALIZABLE
    mysq> set transaction isolation level read uncommitted;
    mysql> set global transaction isolation level read uncommitted; //第二种设置方式// 没有效果需要重开dos
    mysql> set autocommit = 0;
    mysql > select * from account;

    四、视图概念
    1、什么是视图
    视图:MySQL从5.0.1版本开始提供视图功能。一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果

    2、视图应用场景
    多个地方用到同样的查询结果
    该查询结果使用的sql语句较复杂

    3、示例

    CREATE VIEW my_v1
    AS
    SELECT studentname,majorname
    FROM student s
    INNER JOIN major m
    ON s.majorid=m.majorid
    WHERE s.majorid=1;

    4、视图的好处
    使用简单
    安全
    数据独立

    5、创建或者修改视图
    创建视图的语法:
    create [or replace] view view_name
    As select_statement
    [with|cascaded|local|check option]

    修改视图的语法
    alter view view_name
    As select_statement
    [with|cascaded|local|check option]

    6、视图更新性
    视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的。
    (1)包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
    (2)常量视图
    (3)Select中包含子查询
    (4)join
    (5)from一个不能更新的视图
    (6)where子句的子查询引用了from子句中的表

    7、删除视图的语法
    用户可以一次删除一个或者多个视图,前提是必须有该视图的drop权限。
    drop view [if exists] view_name,view_name …[restrict|cascade]

    8、查看视图结构的语法
    show tables;
    如果需要查询某个视图的定义,可以使用show create view命令进行查看
    show create view view_name \G

    视图实操
    1、视图的创建和使用
    #视图
    /*
    视图:基于原始表得到的一个虚拟的查询结果集
    视图和表的区别:

    1. 表中的数据占用物理空间,视图不占用。
    2. 表中的数据是实际存在的,视图的数据是执行查询时动态生成的

    视图的好处:
    1、提高查询语句的重用性,调用简单
    2、安全
    3、独立

    视图的应用场景:
    1、多个地方用到相同的查询结果
    2、查询结果使用了比较复杂的sql语句
    一、创建视图:
    create [or replace] view 视图名
    as
    select 语句;

    特点:
    1、视图的使用和表的使用是一致的,都支持增删改查,而且语法一样
    2、如果视图的查询语句中包含一些特殊关键字,则不支持增删改
    分组函数、distinct、group by、having、union或者union all
    常量视图
    Select中包含子查询
    join
    from一个不能更新的视图
    where子句的子查询引用了from子句中的表

    二、修改视图
    #方式1.如果视图存在,则修改;如果视图不存在,则创建

    	CREATE OR REPLACE VIEW 视图名
    	AS
    	新的查询语句
    #方式2.修改视图
    
    	ALTER VIEW 视图名 AS 
    	新的查询语句
    

    三、删除视图
    可以同时删除多个视图。
    语法:drop view 视图1,视图2;

    */

    #一、创建视图
    CREATE VIEW myv1
    AS
    SELECT * FROM beauty
    WHERE id>3;

    #二、使用视图

    #1.查询
    SELECT * FROM myv1;
    SELECT * FROM beauty;

    #2.插入
    INSERT INTO myv1 VALUES(14,‘罗大磊’,‘男’,‘1998-1-1’,‘111’,NULL,NULL);
    INSERT INTO myv1 VALUES(2,‘马小宁’,‘男’,‘1998-1-1’,‘111’,NULL,NULL);

    #3.更新
    UPDATE myv1 SET NAME=‘宋茜’ WHERE id=6;

    #4 .删除
    DELETE FROM myv1 WHERE id=14;

    #具备以下特点的视图不允许更新
    /*包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
    常量视图
    Select中包含子查询
    join
    from一个不能更新的视图
    where子句的子查询引用了from子句中的表
    */

    #① 关键字
    CREATE VIEW myv2
    AS
    SELECT COUNT(*),boyfriend_id
    FROM beauty
    GROUP BY boyfriend_id;

    SELECT * FROM myv2;
    UPDATE myv2 SET boyfriend_id = 10 WHERE boyfriend_id=1;

    #②常量视图
    DROP VIEW myv3;
    CREATE VIEW myv3
    AS
    SELECT ‘china’ c;

    SELECT * FROM myv3;
    UPDATE myv3 SET c=‘Jap’;

    #③select中包含子查询
    CREATE VIEW myv4
    AS
    SELECT (
    SELECT MAX(boyfriend_id)
    FROM beauty
    ) a;
    SELECT * FROM myv4;

    UPDATE myv4 SET a=100;

    #④join update好用 但是insert 不好用
    CREATE VIEW myv5
    AS
    SELECT NAME,boyname
    FROM beauty b
    JOIN boys bo ON b.boyfriend_id=bo.id;

    SELECT * FROM myv5;

    UPDATE myv5 SET NAME=‘安娜’ WHERE NAME=‘热巴’;

    INSERT INTO myv5 VALUES(‘刘晓婷’,‘刘婷婷’);

    #⑤from一个不能更新的视图

    CREATE VIEW myv6
    AS
    SELECT * FROM myv5;

    SELECT * FROM myv6;

    INSERT INTO myv6 VALUES(‘刘晓婷’,‘刘婷婷’);

    #⑥where子句的子查询引用了from子句中的表

    2、视图的修改和删除
    #修改视图
    #方式一:
    CREATE OR REPLACE VIEW myv1
    AS
    SELECT * FROM beauty;
    SELECT * FROM myv1;

    #方式二:
    ALTER VIEW myv1
    AS
    SELECT id,NAME
    FROM beauty;

    #四、删除视图
    #DROP VIEW 视图名1,视图名2,…
    DROP VIEW myv1,myv2,myv3,myv4,myv5;

    #五、查看视图结构
    DESC myv1;
    SHOW CREATE VIEW myv1;

    五、存储过程
    1、什么是存储过程?
    存储过程:
    事先经过编译并存储在数据库中的一段sql语句的集合。

    使用好处:
    1、简化应用开发人员的很多工作
    2、减少数据在数据库和应用服务器之间的传输
    3、提高了数据处理的效率
    2、创建存储过程和函数
    (1)创建存储过程
    create procedure 存储过程名 ([proc_parameter[,…]])
    [characteristic…]routine_body

    (2)创建函数
    create function 函数名([func_parameter[,…]])
    returns type
    [characteristic…]routine_body

    proc_parameter:
    [in|out|inout] param_name type
    Func_paramter:
    param_name type
    Type:
    任何有效的mysql数据类型
    Characteristic:
    language sql(默认,且推荐)
    |[not] deterministic
    |{contains sql|no sql|reads sql data|modifies sql data}
    |sql security{definer|invoker}
    |comment ‘string’
    Rountine_body:
    有效的sql 过程语句

    3、调用存储过程或函数

    (1)调用存储过程
    call 存储过程名(参数列表)

    (2)调用函数
    Select 函数名(参数列表)

    4、修改存储过程或函数

    修改存储过程:
    alter procedure 存储过程名 [charactristic…]

    修改函数:
    alter function 函数名 [charactristic…]

    characteristic:
    {contains sql|no sql|reads sql data|modifies sql data}
    |sql security{definer|invoker}
    |comment ‘string’

    5、删除存储过程或函数
    说明:一次只能删除一个存储过程或者函数,并且要求有该过程或函数的alter routine 权限

    删除存储过程:
    drop procedure [if exists] 存储过程名

    删除函数:
    drop function [if exists] 函数名

    6、查看存储过程或函数
    1.查看存储过程或函数的状态:
    show {procedure|function} status like 存储过程或函数名

    2.查看存储过程或函数的定义:
    show create {procedure|function} 存储过程或函数名

    3.通过查看information_schema.routines了解存储过程和函数的信息(了解)
    select * from rountines where rounine_name =存储过程名|函数名

    sqlyog 这个第三方客户端,不支持BEGIN 和 END,但是navicat这个第三方客户端支持begin和end
    存储过程是不能修改的,非要修改,只能删除了,重新建
    #存储过程
    #一、创建

    #语法:
    #CREATE PROCEDURE 存储过程的名称(【IN/OUT/INOUT】 参数名 参数类型)
    #BEGIN

    主体

    #END

    #类似于java的方法

    #修饰符 返回类型 方法名(参数列表){

    方法体

    #}

    ###1.参数对应的in、out、inout的意思
    #IN 代表该参数 作为输入(传统意义的参数)
    #OUT 代表该参数 作为输出 (传统意义的返回值)
    #INOUT 代表该参数既可以作为输入又可以作为输出 (参数+返回)
    #支持:多个IN、多个OUT、多个INOUT
    #支持:无参

    ###2.主体
    #增删改查语句都可以、变量、循环、条件等

    #每条SQL语句结尾分号
    #DELIMITER 结束符
    #默认结束符:分号,假如不想分号结尾,则可以自己设置

    #二、调用存储过程
    /*
    ①调用无参的存储过程
    CALL 存储过程名()
    ②调用in类型参数的存储过程
    CALL 存储过程名(常量值)
    ③调用out类型参数的存储过程
    call 存储过程名(@变量名) select@ select @变量名
    ④调用inout类型参数的存储过程
    set @变量名=值 CALL@ CALL 存储过程名(@变量名)
    SELECT @变量名 $$

    #三、用户变量:
    定义语法: set @变量名 ;
    赋值语法:
    方式一:普通赋值
    set @变量名:=值;或set @变量名=值;
    select @变量名:=值;

    	方式二:通过查询结果为变量赋值
    	select 字段|表达式 into 变量名
    	from 表名 【where 条件】	
    

    六、标识列
    #标识列
    /*
    又称为自增长列

    语法:
    AUTO_INCREMENT

    特点:设置为标识列的字段,值不用手动插入,自动会有序列值,不用担心重复问题
    ①标识列字段的类型必须为数值型
    ②标识列字段必须为一个key
    主键或唯一或外键
    ③一个表中至多有一个标识列
    ④ 如果用delete删除,标识列的值从断点开始
    如果用truncate删除,标识列的值从1开始

    七、流程控制
    1、变量
    #流程控制结构
    /*
    顺序
    分支
    循环
    一、变量
    二、分支
    三、循环
    */

    #一、变量
    #1、用户变量
    #声明并赋值语法:

    SET @变量名=值;

    SET @变量名:=值;

    SELECT @变量名:=值;

    #赋值:

    方式一:

    同上述三种

    方式二:

    SELECT 字段|常量|表达式 INTO 变量

    【FROM 表】;

    #使用语法:

    SELECT @变量名;

    #2、局部变量
    #声明的语法:
    DECLARE 变量名 类型 【DEFAULT 值】;

    #赋值的语法:
    方式一:
    同上述三种
    方式二:
    SELECT 字段|常量|表达式 INTO 变量
    【FROM 表】;
    #使用语法:
    SELECT 变量名;

    #注意:用户变量和局部变量的区别

    		作用域					声明位置						
    用户变量	比较大					可以在BEGIN END 的外面也可以在里面
    局部变量	只能在声明该变量的BEGIN END中		只能在BEGIN END 的里面
    

    2、分支
    #分支结构
    #1、IF函数
    #语法:
    SELECT IF(10>3,‘哈哈’,‘嘎嘎’);

    #应用在:BEGIN END 的里面和外面都行

    #2、CASE END
    #应用在:BEGIN END 的里面和外面都行

    #3、CASE END
    #类似于switch
    #4、IF ELSEIF ELSE
    #类似于多重IF
    #语法:
    IF 条件1 THEN 语句1;
    ELSEIF 条件2 THEN 语句2;
    ELSEIF 条件3 THEN 语句3;
    ELSE 语句n;
    END IF ;

    3、循环
    循环结构
    #1、WHILE结构
    #语法:

    【标签:】WHILE 循环条件 DO
    	循环体;
    END WHILE 【标签】;
    

    #2、REPEAT结构
    #语法:

    【标签:】REPEAT
    循环体;
    UNTIL  结束条件 END REPEAT 【标签】;
    

    #while和repeat的对比
    执行顺序 循环条件 语法不同
    #WHILE 先判断后执行 循环成立的条件 WHILE关键字
    #REPEAT 先执行后判断 循环结束的条件 REPEAT关键字

    展开全文
  • mysql约束

    2020-07-26 19:03:25
    约束 1、列级约束 #常见约束 /* NOT NULL:非空 该字段的值是必填的,如果不设置该约束,该字段默认是可以...UNIQUE:唯一约束 该字段值不可以重复 1、可以为空 2、一个表中可以有多个唯一键,可以有组合唯一键 FOREIGN

    约束
    1、列级约束
    #常见约束
    /*
    NOT NULL:非空
    该字段的值是必填的,如果不设置该约束,该字段默认是可以为空
    DEFAULT:默认
    该字段有默认值
    CHECK:检查,mysql语法支持,但效果不支持
    该字段值可以加以限制,比如年龄可以控制在0-120之间

    PRIMARY KEY:主键
    该字段值不可以重复
    1、不可以为空
    2、一个表中只能有一个主键,但是可以多个字段做组合主键
    UNIQUE:唯一约束
    该字段值不可以重复
    1、可以为空
    2、一个表中可以有多个唯一键,可以有组合唯一键
    FOREIGN KEY:外键
    用于限制多表的关系
    1、从表的该字段值必须来自于主表的关联列的值
    2、从表和主表的关联列的类型必须一样
    3、主表的关联列必须是主键
    4、在从表中设置外键
    5、一个表中可以添加多个外键
    6、插入数据时,先插入主表
    删除数据时,先删除从表

    分类:
    位置 支持
    列级约束 列的后面 除了外键
    表级约束 表的后面 除了非空和默认

    */

    #一、★★★★★★★★★★★创建表时添加约束 ★★★★★★★★★★★ √
    #CREATE TABLE 表名(

    字段名 字段类型 列级约束,

    字段名 字段类型 列级约束,

    表级约束

    #)

    #1.添加列级约束
    USE test;
    DROP TABLE IF EXISTS stuinfo;
    CREATE TABLE stuinfo(
    id INT NOT NULL UNIQUE,#非空约束+主键约束
    stuName VARCHAR(20) UNIQUE,#唯一约束
    gender CHAR DEFAULT ‘男’,#默认约束
    age INT UNSIGNED CHECK (age BETWEEN 0 AND 120)#检查约束
    );
    DESC stuinfo;
    SELECT * FROM stuinfo;

    #插入默认值
    INSERT INTO stuinfo(id,stuname,age) VALUES(3,‘lily’,12);
    INSERT INTO stuinfo VALUES(5,‘jack’,DEFAULT,900);

    #唯一和主键
    #1.关于插入null
    INSERT INTO stuinfo VALUES(7,NULL,DEFAULT,900);

    #2.关于插入多个唯一或主键
    DROP TABLE IF EXISTS stuinfo;
    CREATE TABLE stuinfo(
    id INT NOT NULL UNIQUE,#非空约束+主键约束
    stuName VARCHAR(20) UNIQUE,#唯一约束
    gender CHAR DEFAULT ‘男’,#默认约束
    age INT UNSIGNED CHECK (age BETWEEN 0 AND 120)#检查约束
    );

    2、表级约束
    #添加表级约束
    #语法
    CREATE TABLE stuinfo(
    id INT ,
    stuName VARCHAR(20),
    gender CHAR,
    age INT UNSIGNED,
    【CONSTRAINT 约束名】约束类型(字段)
    );

    #案例
    CREATE TABLE grade(
    id INT PRIMARY KEY,
    gradename VARCHAR(20)
    )
    DROP TABLE IF EXISTS stuinfo;
    CREATE TABLE stuinfo(
    id INT NOT NULL,
    stuName VARCHAR(20),
    gender CHAR DEFAULT ‘男’,
    age INT UNSIGNED,
    gradeid INT,
    PRIMARY KEY(id,stuname),#组合主键:id+stuname
    CONSTRAINT uq UNIQUE(age),#唯一键
    CONSTRAINT fk_stuinfo FOREIGN KEY(gradeid) REFERENCES grade(id)#外键约束
    );

    DESC stuinfo;

    SELECT * FROM grade;
    #①组合主键
    INSERT INTO grade VALUES(1,‘一年级’),(2,‘二年级’),(3,‘三年级’);
    INSERT INTO stuinfo VALUES(2,‘lucy’,‘男’,233,1);

    #②外键
    INSERT INTO stuinfo VALUES(3,‘lucy’,‘男’,13,10);

    3、修改表时添加约束

    #★★★★★★★★★★★修改表时添加约束 ★★★★★★★★★★★

    #案例:
    DROP TABLE IF EXISTS stuinfo;
    CREATE TABLE stuinfo(
    id INT ,
    stuName VARCHAR(20),
    gender CHAR,
    age INT UNSIGNED,
    gradeid INT
    );
    DESC stuinfo;

    #1.添加非空
    ALTER TABLE stuinfo MODIFY COLUMN gender CHAR NOT NULL;

    #2.添加默认
    ALTER TABLE stuinfo MODIFY COLUMN age INT UNSIGNED DEFAULT 18;

    #3.添加主键
    #①方式一:列级约束的做法
    ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;

    #②方式二:表级约束的做法
    #语法:
    #ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型 (字段);

    #案例:
    ALTER TABLE stuinfo ADD PRIMARY KEY(id);

    #4.添加唯一

    #①方式一:列级约束的做法
    ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) UNIQUE;

    #②方式二:表级约束的做法
    ALTER TABLE stuinfo ADD CONSTRAINT uq_stuinfo UNIQUE(stuname);

    #5.添加外键
    ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_grade FOREIGN KEY(gradeid) REFERENCES grade(id);

    4、修改表时删除约束
    ##三、★★★★★★★★★★★修改表时删除约束 ★★★★★★★★★★★
    #1.删除非空
    ALTER TABLE stuinfo MODIFY COLUMN gender CHAR ;

    #2.删除默认
    ALTER TABLE stuinfo MODIFY COLUMN age INT UNSIGNED;

    #3.删除主键
    ALTER TABLE stuinfo MODIFY COLUMN id INT ;
    ALTER TABLE stuinfo DROP PRIMARY KEY;

    #4.删除唯一
    ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20);
    ALTER TABLE stuinfo DROP INDEX uq_stuinfo;

    #查看指定表的所有索引
    SHOW INDEX FROM stuinfo;

    #5.删除外键
    ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_grade;

    展开全文
  • mysql 约束

    2020-08-10 08:17:04
    常见约束 /* NOT NULL:非空 该字段的值是必填的,如果不设置该约束,该字段默认是可以为空 ...unique:唯一约束 该字段值不可以重复 1、可以为空 2、一个表中可以有多个唯一键,可以有组合唯一键 foreign key:外键

    常见约束

    /*

    NOT NULL:非空

    该字段的值是必填的,如果不设置该约束,该字段默认是可以为空

    default:默认

    该字段有默认值

    **CHECK:检查,**mysql语法支持,但效果不支持

    该字段值可以加以限制,比如年龄可以控制在0-120之间

    primary key:主键

    该字段值不可以重复

    1、不可以为空

    2、一个表中只能有一个主键,但是可以多个字段做组合主键

    unique:唯一约束

    该字段值不可以重复

    1、可以为空

    2、一个表中可以有多个唯一键,可以有组合唯一键

    foreign key:外键

    用于限制多表的关系

    1、从表的该字段值必须来自于主表的关联列的值

    2、从表和主表的关联列的类型必须一样

    3、主表的关联列必须是主键

    4、在从表中设置外键

    5、一个表中可以添加多个外键

    6、插入数据时,先插入主表

    删除数据时,先删除从表

    分类:

    位置 支持

    列级约束 列的后面 除了外键

    表级约束 表的后面 除了非空和默认

    */

    #一、★★★★★★★★★★★创建表时添加约束 ★★★★★★★★★★★ √

    #CREATE TABLE表名(

    #字段名字段类型列级约束,

    #字段名字段类型列级约束,

    #表级约束

    #1.添加列级约束
    
    use girls
    
    drop table if exists stuinfo
    
    create table stuinfo(
    
      id int not null unique,
    
      stuname varchar(20) unique,
    
      gender char default'男',
    
      age int unsigned check(age between 0 and 120)
    
    )
    
    desc stuinfo
    
    #插入默认值
    
    insert into stuinfo(id,stuname,gender,age) values(1,'bod','女',20)
    
    #唯一和主键
    
    SELECT * from stuinfo
    
    insert into stuinfo VALUES(2,null,default,200)
    
    #2.表级约束
    
    DROP table if exists stuinfo
    
    create table stuinfo(
    
      id int not null,
    
      stuname varchar(20),
    
      gender char default'男',
    
      age int unsigned,
    
      gredeid int,
    
      primary key(id,stuname),
    
      constraint up unique(age),
    
      constraint fk_stuinfo foreign key(gredeid) references grade(id)
    
    
    
    )
    
    CREATE TABLE grade(
    
    id INT PRIMARY KEY,
    
    gradename VARCHAR(20)
    
    )
    
    SELECT * from stuinfo
    
    DROP TABLE IF EXISTS stuinfo;
    
    CREATE TABLE stuinfo(
    
    id INT ,
    
    stuName VARCHAR(20),
    
    gender CHAR,
    
    age INT UNSIGNED,
    
    gradeid INT
    
    );
    
    #1.添加非空
    
    ALTER TABLE stuinfo MODIFY COLUMN gender CHAR NOT NULL;
    
    #2.添加默认
    
    alter table stuinfo modify column age int unsigned default 18
    
    desc stuinfo
    
    #3.添加主键
    
    #①方式一:列级约束的做法
    
    alter table stuinfo modify column id int primary key;
    
    #②方式二:表级约束的做法
    
    DROP TABLE IF EXISTS stuinfo;
    
    CREATE TABLE stuinfo(
    
    id INT ,
    
    stuName VARCHAR(20),
    
    gender CHAR,
    
    age INT UNSIGNED,
    
    gradeid INT
    
    )
    
    DESC stuinfo
    
    alter table stuinfo  add primary key(id)
    
    #4.添加唯一
    
    #①方式一:列级约束的做法
    
    alter table stuinfo modify column stuname varchar(20) unique
    
    #②方式二:表级约束的做法
    
    alter table stuinfo add constraint u_stuinfo unique(stuname)
    
    alter table stuinfo add constraint u_id primary key(id)
    
    #5.添加外键
    
    alter table stuinfo ADD constraint stuinfo_grade foreign key(gradeid) references grade(id)
    
    ##三、★★★★★★★★★★★修改表时删除约束 ★★★★★★★★★★★
    
    #1.删除非空(删除就是重新修改)
    
    alter table stuinfo modify column gender char
    
    SELECT * from stuinfo
    
    #2.删除默认
    
    alter table stuinfo modify column age int unsigned
    
    #3.删除主键
    
    alter table stuinfo modify column in int;
    
    alter table stuinfo drop primary key
    
    #4.删除唯一
    
    alter table stuinfo modify column stuname varchar(20)
    
    alter table stuinfo drop index uq_stuinfo
    
    #查看指定表的所有索引
    
    show index from stuinfo
    
    
    展开全文
  • MySQL数据库的约束

    2020-07-26 16:34:08
    约束 一、列级约束 常见约束 NOT NULL:非空 该字段的值是必填的,如果不设置该约束,该字段默认是...UNIQUE:唯一约束 该字段值不可以重复 1、可以为空 2、一个表中可以有多个唯一键,可以有组合唯一键 FOREIGN KEY:
  • oracle之唯一索引

    万次阅读 2018-01-03 11:38:43
    2 唯一索引,可以理解为:唯一约束,用来控制表中字段的。例如表中有两个或多个字段。插入数据库时,不希望这些字段值出现重复。则可以将这些字段添加为唯一索引。unique 表示唯一 如:create unique index user_...
  • 约束 分类 NOT NULL:非空 该字段的值是必填的,如果不设置该约束,该字段默认是可以为空 ...UNIQUE:唯一约束 该字段值不可以重复 1、可以为空 2、一个表中可以有多个唯一键,可以有组合唯一键 FOREIGN K
  • MySQL基础操作练习——约束、事务 一、约束 1、NOT NULL:非空 该字段的值是必填的,如果不设置该约束,该字段默认是可以...5、UNIQUE:唯一约束 (不可重复) 1)可以为空 2)一个表中可以有多个唯一键,可以有组合唯一
  • 唯一性主键

    2019-09-03 17:00:50
    这里有一个场景,API层面的幂等,例如提交数据,如何控制重复提交,这里可以在提交数据的form表单或者客户端软件,增加一个唯一标示,然后服务端,根据这个UUID来进行去重,这样就能比较好的做到API层面的唯一标...
  • #常见约束 /* 1.NOT NULL:非空;...UNIQUE:唯一约束;该字段值不可以重复 FOREIGN KEY:外键;用于限制多表的关系 #一、★★★★★★★★★★★创建表时添加约束 ★★★★★★★★★★★ √ #CREATE TA
  • 我不能使用“插入重复键忽略”,因为我无法控制客户端的查询.那么,我可以构建这样的触发器吗?或者可能存在一些允许无声忽略的约束?编辑:我挖了一下,我想我想要像SQLite的“Raise Ignore”声明.解决方法:在mysql ...
  • unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。 SQL UNIQUE 约束 UNIQUE ...
  • unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。SQL UNIQUE 约束UNIQUE 约束...
  • (换个说法就是根据数据库的唯一约束(主键就可以)来控制,如果数据重复的话就会报主键重复异常,保证不会出现脏数据) 2:写redis 或者就是写redis,每个消息设置一个唯一的key,这个每次setvalue的结果都是一样,...
  • 当unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。SQL UNIQUE 约束UNIQUE 约束...
  • SEMQ消息重复处理问题

    千次阅读 2014-06-04 23:53:58
    如何保证一个消息在目标接收方只被成功处理一次。...对于简单的接收保存操作,则可以通过数据库的唯一约束进行控制。 如果数据库没有约束,或者不由应用层来判别而由传输层保证,这样,传输机制
  • 当unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。SQL UNIQUE 约束UNIQUE 约束...
  • 在判断记录是否重复,通常在插入这条记录时会用select语句查询时下是否有相同记录,如果存在,就不允许插入。...由于组合字段有些情况下可以重复,所以又不能在组合字段上建立唯一约束。   解决上
  • MYSQL day5

    2020-07-25 21:51:02
    1、列级约束 #常见约束 /* NOT NULL:非空 该字段的值是必填的,如果不设置该约束,该字段默认是可以为...UNIQUE:唯一约束 该字段值不可以重复 1、可以为空 2、一个表中可以有多个唯一键,可以有组合唯一键 FOREIGN KEY
  • mysql

    2020-07-26 16:38:53
    mysql学习MySQL第五天 约束 NOT NULL:非空 该字段的值是必填的,如果不设置该约束,该字段默认是可以为空 ...UNIQUE:唯一约束 该字段值不可以重复 1、可以为空 2、一个表中可以有多个唯一键,可以有组合唯一键 FOREIGN
  • 通用SQL基础

    2020-05-28 15:43:26
    通用SQL基础 DML数据操作语言:insert delete update DDL数据定义语言:create alter drop ...UNIQUE:唯一约束,指定某列或者几列组合不能重复。 PRIMARY KEY:主键约束,指定该列的值可以唯一标识该条记录。 FOREIGN KEY:
  • 在提交注册信息的时候报错:SQLSTATE[23000]: ...原因:主键冲突违反完整性约束 字段唯一索引 从上图可以看出,用户名和邮箱必须唯一,如果填入重复的用户名或者邮箱就会出错 解决方法:在控制器里面进行判...
  • 数据库多表查询

    千次阅读 2014-04-23 15:47:50
    外键是另一个表的主键,外键可以重复的,可以控制,用来和其他表建立联系。 例如 部门表中的主键id 员工表的dept_id就是外键:代表的就是dept的id主键(通过这个dept_id来获取员工的除了员工表之外的相关的...
  • 虽然唯一约束不允许出现重复的值,但是可以为多个null 同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。 唯一约束不仅可以在一个表内创建,而且可以...
  • Mysql操作心得

    2010-05-04 16:17:04
    [b]关于Unique的操作[/b]当unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。...
  • oracle数据库经典题目

    2011-02-17 15:05:20
    唯一约束的列的值不可以重复值 B.唯一约束的列的值可以不是唯一的 C.唯一约束的列不可以为空值 D.唯一约束的列可以为空值 17. 只能存储一个值的变量是哪种变量?( B ) A. 游标 B. 标量变量 C. 游标变量 D. 记录...
  • 好用的代码生成源码

    2019-04-18 16:03:52
    unique="是否唯一约束" nullable="是否可以为空" pk="是否主键,在表没有主键的情况下,可以指定一个代理主键" updatable="是否可以更新" insertable="是否插入" enumString="枚举值,以分号分隔,示例值:M(1,男);F...
  • ABFrameWork Help.chm

    2020-01-10 16:44:00
    (7)、完美支持数据库中设置的唯一约束、主键等特性 数据集组件会自动解解释表的约束主键,字段的唯一值等特性,在提交数据时数据集组件会自动检测这些设置,当提交失败时会自动翻译为”某某字段不能为空”, ”...
  • orcale常用命令

    2009-08-04 00:34:59
    数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。 我们不能手工修改数据字典里的信息。  很多时候,一般的ORACLE用户不知道如何有效地利用它。  dictionary...

空空如也

空空如也

1 2 3 4 5
收藏数 95
精华内容 38
关键字:

唯一约束控制可以重复