我正在测试一个存储过程如下:
DELIMITER $$
CREATE PROCEDURE `test1`(IN `tab_name` VARCHAR(40), IN `value_of` VARCHAR(40), OUT `the_id` INT(1))
BEGIN
SET @t1=CONCAT('
BEGIN
IF EXISTS (SELECT ',tab_name,'.id from ',tab_name,' where ',tab_name,'.',tab_name,' = ',value_of,')
THEN
select id into ',the_id,' from ',tab_name,' where ',tab_name,'.',tab_name,' = ',value_of,';
ELSE
insert into ',tab_name,' values (NULL,',value_of,');
END IF;');
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END $$
DELIMITER ;
尝试选择ID或插入。当我尝试按原样使用此过程时,表中有一行;它没有任何回报。
我想要的值的标识符是为了简单起见的表名。花了很多时间,我不知所措。
已经尝试了所有的东西,即使现在只是想添加NULL,也可以工作,因为表有两个值,我忘了把它放进去只是为了意识到我在第一个if子句中尝试它... IE,输入数据确保调用第一个语句
感谢您的帮助
仍有问题。试着让它尽可能简单。
我有一张城市表,其中包含1条记录。结构就像这样city.city = 'Dublin'
值和表名相同。当通过phpMyAdmin
执行时,follow select语句有效BEGIN
SET @t1= CONCAT("
SELECT id
FROM ",tab_name,"
WHERE ",tab_name," = '",value_of,"'
");
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
现在我只需要确保如果select语句没有返回任何内容,则插入该值并返回select语句。
这似乎是一个简单的问题,但我无法在任何地方找到解决方案
-
INSERT IGNORE
不好,因为无论插入多少,它都会增加ID。是否有解决方法,因为我可以使用它。
INSERT IGNORE
... //没有增量?
SELECT ^
....
我的程序现在看起来像这样(需要两个VARCHAR参数),这当前正在工作。如果值已经存在,它就不会增加ID,这简直太棒了。
BEGIN
SET @t1= CONCAT("INSERT INTO ",tab_name,"(",tab_name,")
SELECT '",city_name,"' FROM dual
WHERE NOT EXISTS (SELECT 1
FROM ",tab_name,"
WHERE ",tab_name," = '",city_name,"');
");
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
我现在想要的只是一个简单的SELECT语句来返回具有该城市名称的行的id。例如SELECT id FROM tab_name WHERE tab_name = 'city_name';
但添加此内容会导致错误:(感谢任何人都有解决这个荒谬问题的方法
答案 0 :(得分:0)
您撰写的声明不应返回结果。 select into和insert语句都不返回结果。
这是一个存储过程。
首先执行SELECT,然后使用insert进行操作。 select将是该过程的第一个输出结果集。
答案 1 :(得分:0)
通过phpMyAdmin工作的解决方案。还必须在PHP和PDO中进行测试,看看是否一切都很好。
CREATE PROCEDURE `select_insert`(IN `the_value` VARCHAR(150), IN `tab_name` VARCHAR(50))
BEGIN
SET @t1= CONCAT("INSERT INTO ",tab_name,"(",tab_name,")
SELECT '",the_value,"' FROM dual
WHERE NOT EXISTS (SELECT 1
FROM ",tab_name,"
WHERE ",tab_name," = '",the_value,"');
");
PREPARE stmt FROM @t1;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @t2 = CONCAT("SELECT id FROM ",tab_name," WHERE ",tab_name," = '",the_value,"'");
PREPARE stmt1 FROM @t2;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END
这是插入或检索表中唯一值的通用过程。我试图解决这个问题时使用了一个城市的例子。
第一个预准备语句将提供的值插入到提供的表名中。如果没有插入,它不会增加自动增量值。
第二个预准备语句检索该值。由于第一个查询的性质,实际上不应该返回任何值。