【问题标题】:SQL: Generate primary key value that is NOT auto generated and has data type of char/ncharSQL:生成非自动生成的主键值,数据类型为 char/nchar
【发布时间】:2012-12-10 10:40:29
【问题描述】:

我想使用 asp.net 网络表单将一些数据输入到表格中。我没有让用户 UI 输入数据进入的表中所需的主键列的值。该表具有不会自动生成值的主键列 (char)。

如何在用户每次填写表单时生成唯一值?

如何在第二次输入数据时检查它确实是唯一的?

谢谢

【问题讨论】:

  • 我必须说这是一个非常糟糕的做法。数据库是生成密钥的最佳和最简单的地方。
  • 使用序列,检索下一个值,然后将其转换为您想要的字符值(可以在函数中完成)。
  • @a_horse_with_no_name,您能详细说明一下代码吗?谢谢
  • 你使用的是哪个数据库?
  • 为什么没有自动生成键列?值必须满足哪些自动增量字段无法满足的要求?了解这一点对于为您提供有关如何自动生成唯一值的建议非常重要。

标签: asp.net sql sql-server-2008 primary-key


【解决方案1】:

在您的 SQL 中创建一个函数来完成此任务。 这不是 cmets 所说的应该做的,而是尝试使用 sql 中的 GUID() 函数生成唯一键,然后从中取出 20 个字符...

未经测试,它看起来像这样:

CREATE FUNCTION fn_GenerateKey
()
RETURNS CHAR(20)
AS
BEGIN

DECLARE @test CHAR (36) 

-- NEWID() will generate a 36 character unique key.
SET @test = NEWID()

-- take the 20 first
SET @test = SUBSTRING(NEWID(),1,20)

--compare @test to the keys already existings to check if you can use it

--Then return @test as the new Key

END
GO

【讨论】:

    【解决方案2】:

    您可以使用不同的日期时间格式来创建唯一键。 日期时间永远不会重复。

    【讨论】:

      【解决方案3】:

      如果您不想使用 DateTime,一个简单的方法是使用 Java 的 Random 函数生成随机数并将其存储为主键。要检查随机数是否没有重复,请将该数字与所有随机数进行比较已作为主键存储在您的表中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-27
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 2019-06-07
        • 2020-09-09
        • 1970-01-01
        • 2017-09-06
        相关资源
        最近更新 更多