【发布时间】:2016-11-02 14:08:47
【问题描述】:
我有一个 SQL Server 表,我在其中插入帐户数据。同一账号不能在同一天重复,但如果日期发生变化,可以重复。
客户根据日期和帐号检索数据。
总之日期+账号是唯一的,不能重复。
由于两者都是不同的字段,我应该将两者连接起来并创建第三个字段作为主键,或者可以选择在合并值上设置主键。
请以最佳方式指导。
【问题讨论】:
标签: sql primary-key
我有一个 SQL Server 表,我在其中插入帐户数据。同一账号不能在同一天重复,但如果日期发生变化,可以重复。
客户根据日期和帐号检索数据。
总之日期+账号是唯一的,不能重复。
由于两者都是不同的字段,我应该将两者连接起来并创建第三个字段作为主键,或者可以选择在合并值上设置主键。
请以最佳方式指导。
【问题讨论】:
标签: sql primary-key
您可以创建复合主键。当您创建表时,您可以在 SQL Server 中执行此类操作;
CREATE TABLE TableName (
Field1 varchar(20),
Field2 INT,
PRIMARY KEY (Field1, Field2))
看看这个对每种 SQL 风格都有帮助的问题
【讨论】:
请看一下,它会消除大部分疑虑!
我们可以将 2 列或更多列组合为主键。
在这种情况下,主键中包含的每一列都会被调用:复合键
请注意复合键永远不能为空 !!
现在,首先让我向您展示如何将 2 列或更多列作为主键。
create table table_name ( col1 type, col2 type, primary key(col1, col2));
好处是:
col1 的值为 (X) 且 col2 的值为 (Y),那么其他行不能将 col1 作为 (X) 将 col2 作为 (Y)。 p>
col1、col2 必须有一些值,不能为空!!
希望对您有所帮助!
【讨论】:
一点也不。只需使用主键约束:
alter table t add constraint pk_accountnumber_date primary key (accountnumber, date)
您也可以在create table 语句中包含此内容。
不过,我可能会建议您使用自动递增/标识/序列主键——每行的唯一编号。然后将帐号/日期组合声明为唯一键。我更喜欢这种合成主键有几个原因:
【讨论】:
另一种方法是有一个 PK,它是一个自动递增的数字,然后在自然键上放置一个唯一的唯一索引。这样可以保留唯一性,但您可以最快地加入任何子表。如果表永远不会有子表,那么复合 PK 是一个好主意。如果有很多子表,这可能是一个更好的选择。
【讨论】: