2014-10-20 105 views
0

我遇到了我的sql查询问题。如果存在或不存在,我需要插入一个需要首先检查的数据。如果数据存在,则sql查询必须返回它,否则插入并返回它。我已经谷歌它,但结果是不太适合我的问题。我已经读过这个。SQL检查是否存在行,如果没有插入并返回它

Check if a row exists, otherwise insert How to 'insert if not exists' in MySQL?

这里是一个查询,”我在想。

INSERT INTO @tablename(@field, @conditional_field, @field, @conditional_field) 
VALUES(
"value of field" 
(SQL QUERY THAT CHECK IF THERE IS AN EXISTING DATA, IF NOT INSERT THE DATA and RETURN IT, IF YES return it), 
"value of feild", 
(SQL QUERY THAT CHECK IF THERE IS AN EXISTING DATA, IF NOT INSERT THE DATA and RETURN IT, IF YES return it) 
); 

请注意,条件字段是必填字段,因此它不能为NULL。

+0

定义“回归它”的意思 – 2014-10-20 11:25:18

回答

0

您可以将它分成2步 1.运行select语句以检索与您的值相匹配的行。 select count(*)会给你行数 2.如果找到零行,则运行insert来添加新值。

或者,您可以为所有列创建唯一索引。如果您尝试插入所有值存在的行,则会返回错误。然后,您可以运行select语句来获取此现有行的ID。否则,插入将工作。

+0

出于某种原因,我无法将其分成2步。 – 2014-10-20 06:18:11

+0

使用单个SQL命令执行此类操作非常困难。我建议你需要用Python或Perl或PHP等语言在简单的脚本中包装你的SQL。他们有很好的库来连接到MySQL。然后,您可以执行一条语句,检查结果并根据第一条语句的结果执行第二条语句。 – 2014-10-20 06:33:36

+0

下面的存储过程看起来像是一个很好的解决方案。 但我还是不太明白你想达到什么目的。如果你想停止重复值进入一个表,一个独特的索引是最好的办法。它会在插入时发出警告。您已经拥有了所有要插入的值,因此不需要由SQL语句返回它们。 – 2014-10-20 22:45:32

0

您可以使用if exists(select count(*) from @tablename)来查看是否有数据,但插入到您需要插入所有列的数据时,如果只有@field缺失,您不能插入插入值,您需要更新表格并采用一些不同的方法。我不知道,为什么你检查每一行?你知道每一行缺少什么?你是否与其他桌子比较?

0

您可以使用MySQL存储过程

示例MySQL存储过程实现它

CREATE TABLE MyTable 
    (`ID` int, `ConditionField` varchar(10)) 
; 

INSERT INTO MyTable 
    (`ID`, `ConditionField`) 
VALUES 
    (1, 'Condition1'), 
    (1, 'Condition2') 
; 


CREATE PROCEDURE simpleproc (IN identifier INT,ConditionData varchar(10)) 
BEGIN 


IF (SELECT ID FROM MyTable WHERE `ConditionField`=ConditionData) THEN 
BEGIN 
    SELECT * FROM MyTable WHERE `ConditionField`=ConditionData; 
END; 
ELSE 
BEGIN 
    INSERT INTO MyTable VALUES (identifier,ConditionData); 
    SELECT * FROM MyTable WHERE `ConditionField`=ConditionData; 
END; 
END IF; 

END// 

调用存储过程

CALL simpleproc(3,'Condition3'); 

DEMO

1

你的标签组很奇怪,我不确定你需要列出所有的技术,但只要Firebird关注,就有UPDATE OR INSERTlink)的构造。 代码也能像

UPDATE OR INSERT INTO aTable 
    VALUES (...) 
    MATCHING (ID, SomeColumn) 
    RETURNING ID, SomeColumn 

注意,这只适用于PK赛,没有可用复杂的逻辑工作。如果这不是一种选择,您可以使用EXECUTE BLOCK,它具有存储过程的所有功能,但是可以像平常一样执行查询。如果两个客户端一次执行更新,则会遇到并发更新错误。

相关问题