函数存储过程和联合主键

创建批量插入数据

第一个命令是DELIMITER //,它与存储过程语法无关。 DELIMITER语句将标准分隔符 - 分号(;)更改为://。 在这种情况下,分隔符从分号(;)更改为双斜杠//。为什么我们必须更改分隔符? 因为我们想将存储过程作为整体传递给服务器,而不是让mysql工具一次解释每个语句。 在END关键字之后,使用分隔符//来指示存储过程的结束。 最后一个命令(DELIMITER;)将分隔符更改回分号(;)。
使用CREATE PROCEDURE语句创建一个新的存储过程。在CREATE PROCEDURE语句之后指定存储过程的名称。

BEGINEND之间的部分称为存储过程的主体。将声明性SQL语句放在主体中以处理业务逻辑。

DELIMITER //
 CREATE PROCEDURE GetAllProducts()
   BEGIN
   SELECT *  FROM products;
   END //
DELIMITER

MySQL prepare语法:

PREPARE statement_name FROM preparable_SQL_statement; /*定义*/

EXECUTE statement_name [USING @var_name [, @var_name] ...]; /*执行预处理语句*/

{DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ;

PREPARE语句用于预备一个语句,并指定名称statement_name,以后引用该语句。语句名称对大小写不敏感。preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。该文本必须表现为一个单一的SQL语句,而不是多个语句。在这语句里,‘?’字符可以被用于标识参数,当执行时,以指示数据值绑定到查询后。‘?’字符不应加引号,即使你想要把它们与字符串值结合在一起。参数标记只能用于数据值应该出现的地方,而不是SQL关键字,标识符,等等。

如果预语句已经存在,则在新的预语句被定义前,它会被隐含地删掉。

存储过程的所有关于数据库增删改查的操作必须在所有 declarre声明完所有 变量 ,包括游标等 之后再执行

在存储过程中常看到declare定义的变量和@set定义的变量。简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量。

drop procedure if exists pinsert;
DELIMITER //
CREATE PROCEDURE pinsert()
BEGIN
DECLARE i int DEFAULT 50244;
set @schoolId = 8;
set @dt = unix_timestamp(NOW());
PREPARE stml FROM 'insert into qb_paper_page(pid, school_id, create_at)values(?,?,?)';
WHILE i <50245 DO
set @pid = i;
EXECUTE stml USING @pid, @schoolId, @dt;
SET i = i+1;
end WHILE;
DEALLOCATE PREPARE stml;
END;
//
DELIMITER ;

CALL pinsert();

DROP PROCEDURE pinsert;

多字段设为主键

一个数据库表只能有一个主键,不允许两个主键。但是允许两个字段联合起来设置为主键,这叫联合主键。

ALTER TABLE 选课表 

ADD CONSTRAINT pk_选课表 PRIMARY KEY(学号);
 
alter table qb_paper_page add CONSTRAINT pk PRIMARY KEY(pid,school_id)

  

原文地址:https://www.cnblogs.com/ampl/p/9812533.html