MySQL: 基于 if 语句的 null 检查
MySQL: null check based on if statement
我有这个程序:
DELIMITER //
CREATE PROCEDURE add_package(nam VARCHAR(255), pack_id INT, lib_id INT, descrip TEXT)
BEGIN
DECLARE ind INT;
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
START TRANSACTION;
INSERT INTO java_master (name, description) VALUES (nam, descrip);
SET ind = (SELECT id FROM java_master WHERE name = nam AND description = descrip);
INSERT INTO java_package (master_id, parent_package_id, library_id) VALUES (ind, pack_id, lib_id);
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END //
DELIMITER ;
我需要让中间的那个 set 语句得到 return id
在 java_master
table 中,即使 description 是空值...关于如何执行此操作有什么建议吗?
由于您没有为 "id" 列提供值,我假设您的 ID 是一个自动递增的值。
-- 我想象中的 table 是什么样的?显示创建 TABLE java_master;
CREATE TABLE java_master (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(10), description VARCHAR(200));
-- 插入空值的例子
INSERT INTO java_master(name, description)
VALUES("class", NULL);
-- 如果是这种情况,您应该使用 LAST_INSERT_ID() 来获取最后为 table 创建的自动递增值。设置这个。
SELECT LAST_INSERT_ID();
如果你坚持按照自己的方式去做,那么我想你可以这样做:
SELECT id FROM java_master WHERE name = nam AND IFNULL(description, "") = IFNULL(descrip, "");
http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id
使用Voidmain提供的答案,我的问题的解决方案与以下代码无关...
DELIMITER //
CREATE PROCEDURE add_package(nam VARCHAR(255), pack_id INT, lib_id INT, descrip TEXT)
BEGIN
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
START TRANSACTION;
INSERT INTO java_master (name, description) VALUES (nam, descrip);
INSERT INTO java_package (master_id, parent_package_id, library_id) VALUES ((SELECT LAST_INSERT_ID()), pack_id, lib_id);
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END //
DELIMITER ;
我有这个程序:
DELIMITER //
CREATE PROCEDURE add_package(nam VARCHAR(255), pack_id INT, lib_id INT, descrip TEXT)
BEGIN
DECLARE ind INT;
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
START TRANSACTION;
INSERT INTO java_master (name, description) VALUES (nam, descrip);
SET ind = (SELECT id FROM java_master WHERE name = nam AND description = descrip);
INSERT INTO java_package (master_id, parent_package_id, library_id) VALUES (ind, pack_id, lib_id);
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END //
DELIMITER ;
我需要让中间的那个 set 语句得到 return id
在 java_master
table 中,即使 description 是空值...关于如何执行此操作有什么建议吗?
由于您没有为 "id" 列提供值,我假设您的 ID 是一个自动递增的值。
-- 我想象中的 table 是什么样的?显示创建 TABLE java_master;
CREATE TABLE java_master (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(10), description VARCHAR(200));
-- 插入空值的例子
INSERT INTO java_master(name, description)
VALUES("class", NULL);
-- 如果是这种情况,您应该使用 LAST_INSERT_ID() 来获取最后为 table 创建的自动递增值。设置这个。
SELECT LAST_INSERT_ID();
如果你坚持按照自己的方式去做,那么我想你可以这样做:
SELECT id FROM java_master WHERE name = nam AND IFNULL(description, "") = IFNULL(descrip, "");
http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id
使用Voidmain提供的答案,我的问题的解决方案与以下代码无关...
DELIMITER //
CREATE PROCEDURE add_package(nam VARCHAR(255), pack_id INT, lib_id INT, descrip TEXT)
BEGIN
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
START TRANSACTION;
INSERT INTO java_master (name, description) VALUES (nam, descrip);
INSERT INTO java_package (master_id, parent_package_id, library_id) VALUES ((SELECT LAST_INSERT_ID()), pack_id, lib_id);
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END //
DELIMITER ;