以下是我的两张表
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
上有索引,那就好了。
答案 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