大佬教程收集整理的这篇文章主要介绍了如何在PostgreSQL中实现多对多关系?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
sql DDL(数据定义语言)语句如下所示:
CREATE table product (
product_ID serial PRIMARY KEY -- implicit primary key constraint
, product text NOT NulL
, price numeric NOT NulL DEFAulT 0
);
CREATE table bill (
bill_ID serial PRIMARY KEY
, bill text NOT NulL
, billdate date NOT NulL DEFAulT CURRENT_DATE
);
CREATE table bill_product (
bill_ID int REFERENCES bill (bill_ID) ON UPDATE CASCADE ON DELETE CASCADE
, product_ID int REFERENCES product (product_ID) ON UPDATE CASCADE
, amount numeric NOT NulL DEFAulT 1
, CONSTRAINT bill_product_pkey PRIMARY KEY (bill_ID, product_ID) -- explicit pk
);
我强烈建议您这样做,因为产品名称几乎不是唯一的(不是很好的“自然键”)。此外,强制使用唯一性并在外键中引用该列通常比使用存储为或的字符串便宜(4字节integer
(甚至8字节bigint
))。text``varchar
不要使用基本数据类型的名称date
作为 。尽管这是可能的,但这是不好的样式,并导致令人困惑的错误和错误消息。使用合法的,小写的,未加引号的标识符。切勿使用保留字,并尽可能避免使用双引号混合大小写标识符。
“名字”不是一个好名字。我将表的列重命名product
为product
(product_name
或类似)。那是一个更好的 。否则,当您在查询中联接几个表时(在关系数据库中做 很多事情) ,最终将得到多个名为“ name”的列,并且必须使用列别名来解决混乱情况。那没有帮助。另一个广泛使用的反模式将只是“ ID”作为列名。
我不确定a的名称是什么bill
。bill_ID
在这种情况下可能就足够了。
price
是 numeric
用于 精确 存储 所输入的 分数(任意精度类型,而不是浮点类型)。如果您只处理整数,则使integer
。例如,您可以将 价格 另存 为美分 。
在amount
("Products"
你的问题)进入连结表bill_product
,是类型的numeric
为好。同样,integer
如果您只处理整数。
您看到 了bill_product
吗?我创建了这两者,以级联更改:ON UPDATE CASCADE
。如果aproduct_ID
或bill_ID
应该更改,则更改将级联到其中的所有相关条目,bill_product
并且没有中断。这些只是参考,没有意义。
我也用ON DELETE CASCADE
了bill_ID
:如果法案被删除,它的细节与它死去。
产品并非如此:您不想删除帐单中使用的产品。如果尝试这种方法,Postgres将抛出错误。您可以添加另一列来product
标记过时的行(“软删除”)。
这个基本示例中的所有列最终都为 ,因此NulL
不允许使用值。(是的, 所有 列-主键列都是UNIQUE NOT NulL
自动定义的。)这是因为NulL
在任何列中值都没有意义。它使初学者的生活更加轻松。但是,您将无法轻松摆脱困境,无论如何您都需要了解NULL
处理方法。其他列可能允许NulL
值,函数和联接可以NulL
在查询等中引入值。
阅读CREATE TABLE
手册中的章节。
主键通过在键列上具有唯一 来实现,从而可以快速查询带有PK列的条件。但是,键列的顺序与多列键有关。由于在我的示例中PK onbill_product
是打开的(bill_ID, product_ID)
,因此您可能想在just上添加另一个索引,product_ID
或者(product_ID, bill_ID)
如果您有查询在寻找给定product_ID
和no的查询bill_ID
。
我相信标题是不言而喻的。如何在PostgreSQL中创建表结构以建立多对多关系。
我的例子:
Product(name,price);
Bill(name,date,Products);
以上是大佬教程为你收集整理的如何在PostgreSQL中实现多对多关系?全部内容,希望文章能够帮你解决如何在PostgreSQL中实现多对多关系?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。