2012-08-17 40 views
3

我是mysql新手。我在插入记录表1如果table2.I不存在问题已经在形式2个表Table 1和Table:如果表2中不存在如何插入表1?

table1 

dep_id start  stop  modified deleted     
1  23456789 167921525 Yes  No 
2  34567812 345678145 Yes  No 
3  32789054 327890546 No  No 


table2 

start  stop  modified deleted     
23456789 167921525 No  No 
34567823 345678145 No  No 
32789053 727890546 No  No 

我试图将值插入表1的启动且仅当停止字段值它不存在于table2的“开始”和“停止”列中。如果存在,我需要抛出一个错误。 这些表没有主键外键关系。 我很抱歉不知道正确的语法,但我必须在mysql和PHP中做这样的事情。

Replace Into into table1 set 'start'=> $start,'stop' => $stop 
(select 'start','stop' from table2 where table1.start and table1.stop not in table2.start and table2.stop); 

如何查询这2个表插入到Table前检查Table1.start和Table1.stop领域不Table2.start和Table2.stop匹配吗?

+0

我刚刚为我的解决方案设置了一个SQLFiddle演示。尝试一下。 – 2012-08-17 20:10:54

回答

3

你可以这样做:

INSERT INTO table1 (start, stop) 
SELECT a.* 
FROM  (SELECT 123456789 start, 234567890 stop) a 
LEFT JOIN table2 b ON (a.start,a.stop) IN ((b.start,b.stop)) 
WHERE  b.start IS NULL 

123456789234567890是你的输入值分别为startstop

然后,您可以根据您使用的数据库接口(PDO,mysqli等),使用rowCount或num_rows_affected检查它。如果它是0,则不插入记录,否则插入发生。


SQLFiddle Demo

+0

这就是我想要的! – user1028428 2012-08-17 21:26:07

+0

有没有办法参数化硬编码值123456789和234567890 – Gacci 2017-07-10 16:44:02

0

我认为这是你想要的。这需要两个值,$启动和$停止,只有不插入,如果它不表2中存在:

insert into table1 (start, stop) 
    select * 
    from (select $start as start, $stop as stop) t 
    where not exists (select 1 from table2 where start = $start and stop = $end) 
+0

我在ERROR 1064(42000)附近得到一个mysql错误:你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,在第一行选择* from(选择168132540作为开始,168132540作为停止)在'1'附近使用正确的语法。我的mysql版本是mysql Ver 14.14 Distrib 5.1.56,for pc-linux-gnu(x86_64)使用readline 5.1 – user1028428 2012-08-17 17:57:55

+0

@ user1028428。 。 。我认为你在输入行结尾缺少别名“t”。 – 2012-08-17 18:12:30

+0

我加了,但仍然给我错误。错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在'select * from(选择168132540作为开始,168132540作为停止)'t' – user1028428 2012-08-17 18:22:10

0

随着参数的值:

INSERT INTO table1 (start, stop) 
SELECT a.* 
FROM  (SELECT ? start, ? stop) a 
LEFT JOIN table2 b ON (a.start,a.stop) IN ((b.start,b.stop)) 
WHERE  b.start IS NULL 

这工作,但我们通过SQL语句做insert

现在,接口插入记录的解决方案是什么?这是没有SQL语句,与问题中提出的限制。

相关问题