我可以在这里使用复合主键吗?

时间:2014-12-18 07:17:09

标签: sql sql-server

以下是我的两张表

Student(rno int primary key,name varchar(20))

Fees(id int identity,name varchar(10), amount decimal(10,2), pdate date,
rno int foreign key references Student(rno))

Fees表中[id name rno]给出了唯一的。

那么我可以在表Fees上创建复合主键吗?或者需要再添加一个表来规范化?
Fees上的大部分搜索都基于列rno。如果我在rno上有索引,那就好了。

2 个答案:

答案 0 :(得分:0)

如果您希望通过以下代码唯一的(id,rno)集合,则可以创建复合主键

create table my_table (
     column_a integer not null,
     column_b integer not null,
     column_c varchar(50),
     primary key (column_a, column_b)
);

创建复合主键约束后,您将无法插入 rno和id的重复组合

答案 1 :(得分:0)

再创建一个FeesMaster表,您可以在其中输入哪种类型的费用及其名称(如果有),价格或其他详细信息。

这将有助于未来扩展。

并将FeesMaster id引用为费用作为费用ID。如果是数字字段,请始终将主键设置为自动递增。

所以你的桌子就像这样。

Student(rno int primary key with auto-increment,name varchar(20))

FeesMaster(feesid int primary key with auto-increment,name varchar(20), price int, dueprice int) --last 2 is optional or give other detail which work as a master detail

--use this table as a transaction table of both above master table, the logic is
Fees(
id int identity, 
rno int foreign key references Student(rno),
feesid id foreign key references FeesMaster(FeesID), 
amount decimal(10,2), 
pdate date)

更新: -

Fees
    id is primary-key of Fees table which are auto-increment
    rno is refernce-key of Student table's rno column
    feesid is refernce-key of FeesMaster table's feesid column

因此在插入中根据费用名称给出费用主的费用。为了获取数据,查询看起来像

select s.name as studentname, fm.name as feesname
from student s
inner join Fees f on f.rno = s.rno
inner join FeesMaster fm on f.feesid = fm.feesid