3

我有一个简单的数据库结构如下:

id       group     stat

123      abc       1
345      fdg       0

我需要先检查数据库中是否存在重复的“id”。如果没有重复,则可以插入新行。如果存在重复的“id”,我需要检查“stat”是 1 还是 0。如果“stat”设置为 0,我什么也不想做。如果“stat”设置为 1,我想插入一个新行,重复的“id”是可以的,因为用户可以在多个组中。

我是一个完整的菜鸟,所以任何帮助表示赞赏。

4

5 回答 5

2

你在找这个吗?

INSERT INTO Table1
SELECT 123, 'def', 1
  FROM Table1
 WHERE 
( 
  SELECT COUNT(*)
  FROM table1
 WHERE id = 123 AND stat = 1
) > 0
LIMIT 1;

这是SQLFiddle演示。请注意,一秒钟INSERT不会发生。

于 2013-06-14T19:18:31.527 回答
0

像这样的声明将符合您的规范:

INSERT INTO `mytable` (`id`, `group`, `stat`)
SELECT 345     AS `id`
     , 'foo'   AS `group`
     , 1       AS `stat`
  FROM DUAL
 WHERE NOT EXISTS
       ( SELECT 1
           FROM `mytable` d
          WHERE ( d.id = 345 AND d.stat = 1 AND d.group = 'foo' )
             OR ( d.id = 345 AND d.stat = /*constant*/ 0 )
       )

请注意,在NOT EXISTS子查询中,相等谓词右侧指定的所有值都是插入的相同值('345','foo','1'),除了常量0(在检查OR 部分中的 d.stat。)

(请注意,stat=0如果有stat=1相同的行,这确实允许插入一行id。我相信这种行为符合规范,但我在那里看到了一些解释的空间。我假设 (id,group ,stat) 应该是唯一的(应该没有重复),并且 if (id,stat=0) 的组合也应该是唯一的。

您可以通过检查返回的受影响行数来确定是否插入了行。

在插入中执行重复检查有一些好处:

  • (通常)更好的性能(由于更少的数据库往返)
  • 避免两个(或更多)进程同时检查/插入相同值的竞争条件
  • 更简单的应用程序代码(更少的行)

包含一条关于 SQL 语句应该做什么的评论将对未来的读者非常有益。

于 2013-06-14T19:35:42.700 回答
0

您可以使用此查询来检查重复项(将 ? 替换为您正在检查的 id),然后查询 count 变量以继续您的逻辑。

select id, count(*) as count
from table
where id = ?
group by id
having count > 1

添加伪php代码以完成:

<?php
$specifiedId = '123'
$query = "select id, count(*) from table where id =".$specifiedId."group by id having count(*) > 1"
$result = $mysqli->query($query);
if($result->num_rows == 0){
    //insert new record 
}else{
    $query2 = "select * from table where stat = 1 and id = ".$specifiedId;
    $result = $mysqli->query($query2);
    if($result->num_rows > 0){
        //insert new record 
    }
}
?>

希望这可以帮助!

于 2013-06-14T19:13:00.757 回答
0

INSERT INTO (id,group,stat) VALUES (,,) ON DUPLICATE KEY ;

你也可以使用上面的case语句

SELECT CASE 1 WHEN 1 THEN 'one' -> WHEN 2 THEN 'two' ELSE 'more' END; -> 'one' mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; -> 'true' mysql> SELECT CASE BINARY 'B' -> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; -> 空

我没有安装 mysql,所以请尝试这个并发布它是否有效。谢谢 !

于 2013-06-14T19:24:09.410 回答
0

你可以这样

select * from taske3 where emp_id=$employee_id AND taskdate=$date ;
$num_of_rows = query_rows ;

      if(num_of_rows == 1){
echo "time for the particular project at the given date is already inserted";
          }
    else {
insert into task3 ('e_id','project','task','time','taskdate') VALUES     
     ('$employee_id','$projectassignedto','2','$date');
  }

通过运行 select query 检查条目存在的位置。计算行数,如果条目退出计数将为1,否则为0,然后您可以相应地将数据输入数据库

于 2013-12-02T06:43:52.520 回答