在将表添加到另一个表之前检查表中是否存在id

时间:2013-05-08 13:03:37

标签: php mysql sql

我正在做一件小事,比如你在facebook上看到的like功能。所以我这样做的方式是这样的。我有一个名为products的表,其中包含人们like的产品。 像这样(剥离):

id | prodName               | status (0=clear, 1=blocked)
----------------------------------------------------------
1  | Philips Food Processor | 0
2  | Le Sharp Knife         | 0
3  | Ye Cool Fridge         | 0

Then comes the `likes` table like this:
id | prodName               | prodId | userId
--------------------------------------------
1  | Philips Food Processor | 1      | 1
2  | Le Sharp Knife         | 2      | 1
3  | Ye Cool Fridge         | 3      | 1
4  | Ye Cool Fridge         | 3      | 2

我需要在添加到likes表之前检查具有该id的产品是否实际存在于products表中并且其status = 0.我目前使用大量php代码执行此操作。使用sql做这个的好方法是什么?可能吗?使用外键或类似的东西?

我正在使用innodb表类型。

6 个答案:

答案 0 :(得分:2)

您可以执行条件insert。对于产品6和用户7:

insert  into Likes
        (prodName, prodId, userId)
select  prodName
,       id
,       7
from    Products
where   id = 6
        and status = 0

如果这不插入任何行,则表示该产品不存在,状态为0。

答案 1 :(得分:0)

如果您只想对insert进行说明,使其遵循规则,那么您可以按如下方式使用insert . . . select

insert into likes(prodId, userId)
    select <prodid>, <userid>
    from products p
    where p.prodid = <prodid> and status = 0

我认为MySQL不支持“部分”外键约束,您可以在其中包含对该标志的要求。

并且,您不应将产品名称放在likes表中。您应该在products表格中查找。

答案 2 :(得分:0)

尝试向产品表中不存在的likes表添加内容的关键元素是对用户的反馈,让用户知道他们做错了。您确定的任何答案都不应忽略用户反馈方面的事情 - 这基本上需要您的PHP代码。

但是,是的 - 有一种方法可以通过外键来实现。您可以索引第二个表中的prodid,并将其作为第一个table.id的外键引用。这意味着如果您尝试插入并且出现错误,则问题可能是您尝试在第一个表中添加没有匹配项的内容。

然而,试图确切地确定错误是什么,以便您可以确定响应该错误的正确逻辑导致其自身的大量PHP代码,并且对于未来的开发人员来说不太容易透明。我建议在您的Product对象中使用一个简单的方法:isValid( id )返回true / false - 因此,“检查此代码”只需if( Product.isValid( prodId ) ){ Like.insert( userId, prodId ); }

但与此同时,我真的推荐一个外键约束以及你可能已经使用的php代码,就像保护你的数据库变得混乱没有链接的行一样。通常最好对坏数据设置多个障碍。

此外......您是否有理由将产品名称存储在产品表和相似表中?我不明白为什么你需要它在喜欢的表中。

答案 3 :(得分:0)

--Check to see if cleared product exist in products table
Select count(*) from products p where p.status = 0 and p.id = %IDVALUE

--Check if your user previous liked product
Select count(*) from products p, likes l where p.id = l.prodId and l.userId = %USERID

在您的代码中,您可以执行语句(将%IDVALUE和%USERID替换为实际值)并检查返回列以获取计数并执行自定义逻辑。

答案 4 :(得分:0)

目前,您需要prodId填充likes表,因此无论有关阻止的约束如何,您都需要查找数据。因此:

INSERT INTO likes (prodname, prodId, userId)
SELECT prodname, id, 123456
FROM products
WHERE prodname='Le Sharp Knife'
AND status=0;

(只需用123456和'Le Sharp Knife'代替你需要的参数)。

答案 5 :(得分:-1)

Yuo需要查询数据库来检查记录,

例如,您的产品ID为2,因此您的查询类似于

$query = select * from 'your-like-table' where 'prodId ' = 'ID';

然后

if ( !mysql_query('your-db',$query)):

如果你遇到这种情况,那么就是你输入数据库的时候了

endif;

希望有所帮助