Insert Into有各种各样的麻烦

时间:2013-12-10 15:10:26

标签: mysql sql

我有一个扩展程序,在此扩展程序中有一个“install.sql”文件,其中包含各种插入内容。

这些插入中的一些可以根据客户端站点对可能存在或不存在的表执行此操作。我想知道的是如何做例如:

“如果存在则创建表”但是“插入”。

这是我正在做的一个例子:

INSERT INTO `#__virtuemart_shipmentmethods_en_gb` 
(virtuemart_shipmentmethod_id, shipment_name, shipment_desc, slug) 
VALUES ((SELECT MAX(vs.virtuemart_shipmentmethod_id) 
FROM `#__virtuemart_shipmentmethods` vs), 'Kiala','', 'kiala');

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我不知道我的问题是否合适......

你想要插入某些东西,如果它已经存在,你想要更新吗?

如果是的话,你可以找到 THIS HERE ,否则你的问题设置不好或者我的问题要迟到了。)

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
       ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

如果您不知道该表是否存在,那么您应该检查所有表格 通常我使用pdo,不知道你使用什么,但我的解决方案将是这样的

$result  = mysql_query("SHOW TABLES LIKE '#__virtuemart_shipmentmethods_en_gb'");
$tExists = mysql_num_rows($result) > 0;
if(!$tExists)
    // Create Table Code here

答案 1 :(得分:0)

您是否考虑过运行这是一个存储过程?像

这样的东西
CREATE PROCEDURE `testprocdure` ()
BEGIN

IF (SELECT COUNT(*)
FROM information_schema.tables 
WHERE table_schema = '[database name]' 
AND table_name = '#__virtuemart_shipmentmethods_en_gb') = 1 THEN

INSERT INTO `#__virtuemart_shipmentmethods_en_gb` (virtuemart_shipmentmethod_id, shipment_name, shipment_desc, slug) 
VALUES ((SELECT MAX(vs.virtuemart_shipmentmethod_id) FROM `#__virtuemart_shipmentmethods` vs), 'Kiala','', 'kiala');

ELSE

-- Handle if the table doesnt exists
SELECT ''; -- This is just so the SP wont return a error after the else. Remove this when you want to run it
END IF;
END

如果你有变量,你也可以使用参数。

然后创建语法应如下所示

CREATE PROCEDURE `testprocdure` (IN p_TableName VARCHAR(100))

更改参数和数据类型的名称以满足您的需要。

这可能有帮助吗?