SQL检查是否存在行,如果没有插入并返回它

时间:2014-10-20 06:02:43

标签: mysql sql firebird

我的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。

4 个答案:

答案 0 :(得分:1)

您的标签设置非常奇怪,我不确定您是否需要列出所有技术,但只要Firebird关注UPDATE OR INSERTlink)构造。 代码可能就像

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

请注意,这仅适用于PK匹配,没有复杂的逻辑可用。如果这不是一个选项,您可以使用EXECUTE BLOCK,它具有存储过程的所有功能,但是像通常的查询一样执行。如果两个客户端一次执行更新,您将遇到并发更新错误。

答案 1 :(得分:0)

您可以将其拆分为两个步骤 1.运行select语句以检索与您的valus匹配的行。 select count(*)将为您提供行数 2.如果找到零行,则运行插入以添加新值。

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

答案 2 :(得分:0)

您可以查看if exists(select count(*) from @tablename)以查看是否有数据,但是插入需要为所有列插入数据,因此如果只有@field缺失,则无法插入值插入,您将需要更新表格,并采用一种不同的方法。而我不确定,为什么你检查每一行?你知道每一行都缺少什么吗?你在和其他一些桌子比较吗?

答案 3 :(得分: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