Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 主键约束的警告消息_Sql_Primary Key_Composite Primary Key - Fatal编程技术网

Sql 主键约束的警告消息

Sql 主键约束的警告消息,sql,primary-key,composite-primary-key,Sql,Primary Key,Composite Primary Key,我在一个包含员工信息的表中分配主键时遇到问题。该表中没有唯一的列,我剩下的唯一选项是将三列的组合作为主键 但它会发出一条警告信息,即警告!最大密钥长度为900字节。索引“pk_hrempid”的最大长度为1530字节。对于某些大值组合,插入/更新操作将失败我知道这将是将来插入数据的一个主要问题。是否有此警告的解决方案 另一个问题是,我是否可以将自动增值作为唯一id,建议这样做?我希望确保它不会在将来出现问题,因为我有许多表包含来自其他部门的员工信息。一些员工可能会出现在两张或两张以上的表格中 感

我在一个包含员工信息的表中分配主键时遇到问题。该表中没有唯一的列,我剩下的唯一选项是将三列的组合作为主键

  • 但它会发出一条警告信息,即
    警告!最大密钥长度为900字节。索引“pk_hrempid”的最大长度为1530字节。对于某些大值组合,插入/更新操作将失败
    我知道这将是将来插入数据的一个主要问题。是否有此警告的解决方案

  • 另一个问题是,我是否可以将自动增值作为唯一id,建议这样做?我希望确保它不会在将来出现问题,因为我有许多表包含来自其他部门的员工信息。一些员工可能会出现在两张或两张以上的表格中


  • 感谢您的帮助

    虽然您尝试使用复合主键听起来是在尝试使用“自然键”的最佳实践,但使用自动递增的
    ID
    字段并没有什么“错误”

    如果您建议的字段太大而不能用作键,那么首先它们可能不是最佳选择。您是否可以添加另一个具有更好数据类型的“自然”键列

    不要忘了为将被大量查询的表选择好的索引和合适的数据类型,从而考虑可能的优化

  • 这是主键的限制。您不能有大于900字节的PK

  • 可以向表中添加标识列,并将其设置为主键。我更喜欢使用guid,因为它们是全局唯一的


  • 对于主键,我会使用自动递增类型的解决方案,使用个人数据进行此类操作的问题在于,您无法保证唯一性,这是主键的基本要求。

    希望了解导致该错误的列数据类型定义。很难调试我们看不到的SQL DDL代码;)不要害羞,发布属性名称、数据类型和示例数据。您可能会在这里找到一位对您的业务领域具有领域知识的人,他可以为您指明一个行业标准密钥或其他受信任的标识符来源。@Widor..感谢您提供的线索..我所有的数据类型都有一个默认的nvarchar(255)(因为我从access中放大了),这对于列中的数据来说太长了,我已经更改了主键列的数据类型,那么主键就没有警告了!我是否必须更改所有其他列的数据类型(与nvarchar相比,这些列的数据也很小)…或者可以按原样放置吗?1。这肯定是SQL Server的一个限制吗?2.这并不能防止现有三列中的重复。我猜您的意思是,“除了自然键之外使用代理键没有什么‘错误’……”(旁白:我不同意),但这里的问题是DBMS无法强制执行自然键。@OTTA我应该用“如果自然键可行”或“如果自然密钥适合作为主键。“也就是说,如果“自然”和“代理”都是小的、数字的和可索引的,那么每次都使用“自然”一个。谢谢大家的建议。如果我将一个自动递增值作为所有表中所有员工的主键,我认为这会导致混乱。。不是吗?@user939615是的,您只在
    员工
    表上放置一个自动递增的
    ID
    。同时引用该
    ID
    的任何表都将只是相同的数据类型,但不是自动递增的-并且可能与
    员工有
    外键关系。