1

假设我有一个名为的表category,其中我有 2 列cat_id并且cat_name

表看起来像这样

cat_id   cat_name
1         Science
2         Arts

我有另一个表item,其中表cat_idcategory外键,表看起来像

item_id       item_name    cat_id
1              math          1
2              literature    2
3              physics       1

现在我想写一个这样的查询,如果我再次插入数学Science然后它不会插入但是如果我想插入数学Arts那么它将成功插入。请记住,我手中只有item_nameand cat_name,我想在项目表中添加item_nameand 。cat_idcat_name

到目前为止我做的是这样的

insert into item (item_name,cat_id) select 'abdul',category.cat_id from category where NOT EXISTS (select * from item WHERE category.cat_id = item.foreign_id)

但这给了我尴尬的结果,有人可以帮忙吗?

4

1 回答 1

2

您基本上没有意识到这只是一个规范化问题。当您尝试在同一个表中插入两次“数学”时,这一点变得很明显。这是多对多而不是一对多的关系。经验法则:多对多关系总是生成一个表

适当的表结构如下所示(包括示例数据):

类别:(cat_id)

cat_id   cat_name
1         Science
2         Arts

项目:(item_id)

item_id       item_name
1              math
2              literature
3              physics

Categories_Items (cat_id, item_id)

cat_id       item_id
1              1
1              3
2              2

在圆括号中,您将看到主键。请记住,最后一个表有一个复合 PK。这将使您不必为同一类别重复数学。

于 2013-08-27T20:21:34.380 回答