mysql - 如果数据不保留在 sqlite 中特定外键的表中,如何在列中添加数据

标签 mysql sql sqlite

假设我有一个名为 category 的表我有 2 列 cat_idcat_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_namecat_name在我手中,我想添加 item_namecat_id其中cat_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)

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

最佳答案

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

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

类别:(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。这样您就不会为同一类别重复数学运算。

关于mysql - 如果数据不保留在 sqlite 中特定外键的表中,如何在列中添加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18474282/

相关文章:

mysql - 将两个不同查询的结果合并为一个查询

php - 选择重复的行

mysql - 只有两个左连接的 SQL 查询非常慢

sql - 将 JSON 字符串转换为十进制的问题

php - 在 Doctrine 中使用 IS TRUE sql 语句

ruby-on-rails - 如何为 rails 和 sqlite 设置时区?

mysql - 消除连接中相同列的歧义

mysql - 如何使用 mysql workbench 进行自动 mysql 数据库备份

c# - DataGridView 不显示 DataTable

java - 从sqlite中获取数据并存储在json中