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

基本语法


新建数据库

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;

猜你喜欢

转载自blog.csdn.net/hj5419/article/details/80348497
今日推荐