使用NVARCHAR类型创建主键和表之间的关系

时间:2017-01-31 16:55:52

标签: sql sql-server database

我有相当的SQL难题。

我是第一个合作社职位的初级程序员,我获得了一个包含三个表格的数据库。三个表中的任何一个都没有主键。这些表彼此之间没有初始关系。这是(大致)设计数据库的方式。

Table 1     Table2      Table3
========    ========    ========    
SSerial     BSerial     MSerial
B1          data2       data2
B2          data3       data3
B3          data4       data4
M1          data5       data5
M2          data6       data6
M3          data7       data7

SSerial,BSerial和MSerial具有永远不会重复的唯一字母数字值(nvarchar(MAX))。

BSerial的值可以在表1的B1,B2和B3中找到。

MSerial的值可以在表1的M1,M2和M3中找到。

我正在处理的应用程序的最终目标是允许客户端按表1中的唯一SSerial编号进行搜索,然后查看B1,B2和B3中的BSerial值。他们也可以使用M1,M2和M3中的MSerial值进行相同的操作。

我尝试过实现一个主键,这样我就可以在Table1和其他表之间添加一个关系,但是没有用。

当我尝试创建主键时:

ALTER TABLE dbo.Table2
ADD Table2_ID int NOT NULL IDENTITY (1,1);

ALTER TABLE dbo.Table2
ADD CONSTRAINT PK_Table2_ID PRIMARY KEY (Table2_ID, BSerial);

我很幸运,收到以下错误消息:

Msg 1919, Level 16, State 1, Line 1
Column 'BSerial' in table 'Table2' is of a type that is invalid for use as a key column in an index.

其他信息:

  1. SSerial,BSerial和MSerial不为NULL且类型为NVARCHAR(MAX)。
  2. B1,B2,B3,M1,M2和M3允许NULLS,因为不会总是有三个与SSerial相关的BSerial或MSerial。它们的类型为NVARCHAR(MAX)。
  3. 从头开始重新创建数据库并不理想,因为每个表中有数千行数据,但可以完成。
  4. 这是我的第一个Stack Overflow问题,如果需要更多信息,我非常欢迎您详细说明。谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

将数据类型从NVARCHAR(MAX)更改为NVARCHAR(450)
索引的密钥不能超过900字节的总大小。

答案 1 :(得分:0)

我建议重新设计你的数据库,但如果这不实用,你不需要主键来实现你的目标。要使下面的代码工作,BSerial和MSerial值必须与表1完全匹配。

_.mixin()