【问题标题】:how to create a stored procedure in mysql the right way如何以正确的方式在mysql中创建存储过程
【发布时间】:2013-07-10 21:03:05
【问题描述】:

PHP mysqli 存储过程快速指南,http://php.net/manual/en/mysqli.quickstart.stored-procedures.php

if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") ||
    !$mysqli->query("CREATE PROCEDURE p(IN id_val INT) BEGIN INSERT INTO test(id) VALUES(id_val); END;")) {
    echo "Stored procedure creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

这不是删除程序然后替换它吗?这是正确的方法吗?删除它有什么意义?删除它并不能否定拥有一个可以在 MySQL 连接期间调用的过程的全部意义吗?

【问题讨论】:

  • AFAIK 删除该过程(如果存在)并从头重新创建它是它在所有 SQL 数据库系统中的工作方式。
  • 你知道为什么必须放弃它吗?这只是一个好习惯吗?如果是,为什么?
  • 我想这样做会更简单,而不是有一些复杂的编辑机制。通常,您不会在每次建立 MySQL 连接时都创建存储过程。你把你的存储过程放在那里一次,然后把它们放在那里,除非它们改变。
  • 在 Oracle 中,语法包括 CREATE OR REPLACE - 所以从技术上讲不是删除和重新创建。

标签: php mysql stored-procedures mysqli


【解决方案1】:

您必须先删除“旧”过程,否则 CREATE 将失败并出现“已存在”错误。对于数据库中的几乎每个对象都是一样的,例如

CREATE TABLE foo ...   // creates the table
CREATE TABLE foo ...   // will **NOT** replace the one just created

您不能仅通过重新定义来“覆盖”表/proc/db。您必须先删除原始的。

考虑一下,如果一家大银行的一些糟糕的 DBA 不小心跑了会发生混乱

CREATE DATABASE clients;

并丢弃了他们的整个客户端数据库,因为数据库引擎用这个新的空数据库替换了原始数据库。

【讨论】:

  • 因此,如果每个连接的存储过程为每个不同的连接分别记住,并且我知道我从来没有两个同名的过程,我可以测试该过程是否存在,如果它只创建它不存在?如果该程序确实存在,我是否不需要放弃该程序?
  • 类似于Oracle中的CREATE OR REPLACE?
  • 不知道关于 oracle 的具体概念,但通常存储过程是永久存储的,可供任何/所有连接/用户使用。
  • 适用于任何/所有连接/用户,但仅适用于该数据库?
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2016-11-11
  • 2017-10-14
  • 2021-07-10
  • 2015-08-27
  • 2017-06-19
相关资源
最近更新 更多