我在MySQL中创建了一个函数:
CREATE DEFINER=`DBadmin`@`localhost` FUNCTION `insert_color`(
p_color_Name VARCHAR(45)
) RETURNS int(11)
BEGIN
DECLARE
color_count INT;
SELECT COUNT(p_color_Name) INTO color_count FROM Color
WHERE p_color_Name = Color.Color_Name;
IF color_count >= 1 THEN
RETURN -1;
ELSEIF color_count = 0 THEN
INSERT INTO Color(Color_Name)
VALUES (p_color_Name);
RETURN 1;
END IF;
END
我想在PHP中调用它来插入使用输入的信息,但我遇到了麻烦。
<?php
$conn = new mysqli('localhost','DBadmin','dbadmin','BirdDatabase');
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
echo "-1";
return false;
}
$var1 = $_GET['selectedOption'];
$var2 = $_GET['newNameText'];
$var3 = $_GET['selectedType'];
else if ($var1 == "Color"){
$sqlVariableUser = 'SELECT insert_color(?);';
if(!$stmt = $conn->prepare($sqlVariableUser)){
exit($conn->error);
return false;
} else {
$stmt->bind_param($var2);
$stmt->execute();
$result= $stmt->get_result();
exit ($result);
}
}
?>
我是MySQL新手,我知道如何使用oracle数据库执行此操作,但我遇到了MySQL连接问题。任何建议都会有所帮助:)
答案 0 :(得分:0)
看起来很难完成一项相当简单的任务。当我们只用SQL完成我们需要的东西时,我们倾向于避免创建MySQL存储程序。
当函数从两个(或更多)会话同时执行时,函数中存在潜在的竞争条件。两次执行中的SELECT可能找不到指定的color_name
,然后两个会话都将尝试插入相同的color_name
。
如果color_name
在颜色表中应该是UNIQUE,那么声明一个UNIQUE约束,让数据库为您检查它,并在尝试将重复的color_name
插入到该数据库时返回错误表。或者,如果您不想打扰错误,请使用INSERT IGNORE
。或者,INSERT ... ON DUPLICATE KEY
声明。
如果有某种原因导致color_name
不能成为UNIQUE,那么你仍然可以使用一个INSERT ... SELECT
语句完成该函数正在做的事情,该语句执行检查行是否已存在。< / p>
INSERT INTO color (color_name)
SELECT v.color_name
FROM ( SELECT c.color_name
FROM ( SELECT ? AS color_name ) c
LEFT
JOIN color d
ON d.color_name = c.color_name
WHERE d.color_name IS NULL
AND c.color_name IS NOT NULL
) v
内联视图c
返回包含提供的值的行,如果匹配的行尚不存在,则返回我们要插入表的color_name的值。
内联视图v
使用反连接模式,仅当表中不存在匹配的行时才从c
返回行。外INSERT ... SELECT
将尝试从v
插入一行。
(你问过建议;这些是我的建议。)