2010-02-16 58 views
6

我有一个MySQL表'阿尔法',将在一列中包含另一个表“测试版”的主键。但是如果无法找到'beta'中的条目,我想在'beta'中插入值,并在'alfa'中使用新的键。我能以某种方式在一个查询中做到这一点吗?插入,如果不存在其他只是在mysql中选择

我目前有:

INSERT INTO alfa SET c1=(SELECT id FROM beta WHERE name = 'john'); 

当“约翰”在表中存在的正常工作,但在其他方面失败。那么我是否可以改进它,让新名称被插入并选择,如果它不在那里? id是auto_incremented。

我试着去看IF,但还没有找到如何使用IF以外的SELECT,这是可能的吗?

我知道我可以在几个查询中做到这一点,但我正在与远程数据库交谈,所以一次可以完成所有工作。

例如可能已创建这样的表:

CREATE TABLE alfa (
    c1 int, 
    PRIMARY KEY (c1) 
) 

CREATE TABLE beta (
    id int auto_increment, 
    name varchar(255), 
    PRIMARY KEY (id) 
) 

所以alfa.c1应参照beta.id值。

总之我想做的事:

从公测表中插入约翰将ID为C1在阿尔法,如果约翰不处于测试阶段,存在再插入约翰进入测试阶段,插入新的自动递增的ID为约翰进入阿尔法的c1。

+0

你可以编辑你的问题,并至少把表结构?目前还不清楚你从哪里获得测试版所需的附加信息?如果还没有在测试版中创建,alfa可能有多少钥匙? – 2010-02-16 19:14:37

+0

我试图现在添加更多信息。 – Zitrax 2010-02-16 19:49:33

回答

3

我会走的,但要记住,来自微软的SQL背景,我不熟悉你的表的确切结构,所以一些SQL可能有点狼狈。

IF (SELECT COUNT(*) FROM beta WHERE name = 'John' > 0) 
    UPDATE alfa SET c1=(SELECT id FROM beta WHERE name = 'John') 
ELSE 
BEGIN 
    INSERT INTO beta (name) VALUES ('John') 
    INSERT INTO alfa (c1) VALUES (LAST_INSERT_ID()) 
END 

希望这有些帮助。

+1

p.s.如果您担心查询的数量,为什么不使用存储过程,这样您仍然只能对远程服务器进行单一调用。 – Bryan 2010-02-16 20:07:28

+0

谢谢,这似乎很接近。但语法是IF .. ELSE .. END IF。而且似乎IF语句只能用在程序中,所以我必须在任何情况下使用它。这里讨论同样的问题:http://is.gd/8xupF – Zitrax 2010-02-16 23:33:37