【mysql】#语法#mysql的创建语法

时间:2021-08-01 11:24:54

基本语法


新建数据库

CREATE DATABASE test1 DEFAULT CHARACTER SET utf8;

创建表

CREATE TABLE IF NOT EXISTS test_table (id int(11) NOT NULL AUTO_INCREMENT, # `AUTO_INCREMENT`自增 name VARCHAR(20) DEFAULT NULL, #`DEFAULT`默认为null fee decimal(10,2) UNSIGNED NULL, #`UNSIGNED` 不能为负 user_id int(11) comment '用户id', #`comment `备注 opt_id int(11) NOT NULL, create_time datetime NULL ON UPDATE CURRENT_TIMESTAMP, #`ON UPDATE CURRENT_TIMESTAMP`根据系统时间来更新 PRIMARY KEY(id), # `PRIMARY KEY`主键 INDEX index_userId(user_id), # `INDEX `索引 CONSTRAINT `ref_optId` FOREIGN KEY (opt_id) REFERENCES `demo`(`id`) #`REFERENCES `外键约束 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试';

复制表

CREATE TABLE test2 like test; 
#创建表test2跟test一样的结构

创建临时表
关闭连接,自动删除表

CREATE TEMPORARY TABLE tmp_table (id int(11) not NULL AUTO_INCREMENT, name VARCHAR(20) DEFAULT NULL, user_id int(11) COMMENT '用户id', opt_id int(11) NOT NULL, fee decimal(10,2) UNSIGNED NULL, create_time datetime NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY(id), INDEX index_userId(user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试'; 

创建表分区

DROP TABLE if EXISTS test_table;
CREATE TABLE IF NOT EXISTS test_table (id int(11) not NULL AUTO_INCREMENT, name VARCHAR(20) DEFAULT NULL, ddate date NOT NULL, PRIMARY KEY(id,ddate)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试' /* RANGE:基于一个连续区间的列值,把多行分配给分区 LIST:列值匹配一个离散集合; Hash:基于用户定义的表达式的返回值选择分区,表达式对要插入表中的列值进行计算。这个函数可以包含SQL中有效的,产生非负整数值的任何表达式 KEY:类似于HASH分区,区别在于KEY 分区的表达式可以是一列或多列,且MYSQL提供自身的HASH函数 */ PARTITION BY RANGE COLUMNS (ddate)( #分区字段(ddate) 必须是主键字段 PARTITION p0 VALUES less than ('2018-01-01'), PARTITION p1 VALUES less than ('2018-07-01'), PARTITION p2 VALUES less than ('2019-01-01'), PARTITION p3 VALUES less than ('2019-07-01'), PARTITION p4 VALUES LESS THAN MAXVALUE);

创建视图

CREATE view v_test as selct id,name from test; 

创建自定义函数

DELIMITER ;;
CREATE FUNCTION f_test(name varchar(20)) RETURNS VARCHAR(20) BEGIN DECLARE result VARCHAR(20);
SET result =name;
RETURN result;
END ;;

创建自定义存储过程

DELIMITER ;;
CREATE PROCEDURE p_test(aId INT(11)) SQL SECURITY INVOKER #可以被其他调用 BEGIN DECLARE result VARCHAR(20) DEFAULT 'null';
DECLARE is_error INTEGER;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET is_error=1;
    START transaction; # 开始事务
    update test_table SET name ='张三' where id =aId;
    SELECT name into result from test_table where id =aId;
    IF is_error =1 THEN
        ROLLBACK; # 失败回滚
    ELSE commit; # 提交 
    END IF;
    select result;
END ;;

创建事件

CREATE EVENT `e_test` ON SCHEDULE EVERY 1 DAY STARTS '2018-01-01 00:00:00' ENDS '2018-12-31 23:59:59' ON COMPLETION NOT PRESERVE ENABLE DO CALL p_test(s11); #调用存储过程

创建游标

DELIMITER ;;
CREATE PROCEDURE p_test(aId INT(11)) SQL SECURITY INVOKER BEGIN DECLARE Done INT DEFAULT 0; 
DECLARE is_error INTEGER;   
DECLARE name,addr,mail varchar(100);
DECLARE cur_test cursor for # 创建游标
    SELECT name,address,mail from test_table ; 
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET is_error=1;
    start transaction; 
    OPEN cur_test; #打开游标
    FETCH NEXT FROM cur_test into 
    name,addr,mail;
    REPEAT if NOT Done THEN #循环
    SELECT 'success';
    END IF;
    FETCH NEXT FROM cur_test INTO name,addr,mail;
    UNTIL Done END REPEAT; #循环结束
    CLOSE cur_test; #关闭游标
    IF is_error =1 THEN
        ROLLBACK; # 失败回滚
    ELSE commit; # 提交 
    END IF;
END ;;

创建触发器

CREATE TRIGGER trig_test AFTER # BEFOREAFTER 触发时间 INSERT #INSERTUPDATEDELETE 触发条件 ON demo #表名 FOR EACH ROW BEGIN INSERT INTO test_table(id, name) #执行语句 VALUES (112,'王炸');
    END;