如何自动增量varchar

SMU*_*hah 7 sql-server database-design

我可以在一张表中制作"c0001,c0002"和供应商's0001,s0002'等主键吗?

Per*_*DBA 22

  1. 数据库设计的想法是将每个数据元素分开.每个元素都有自己的数据类型,约束和规则.这c0002不是一个领域,而是两个领域.相同XXXnnn或等等.这是不正确的,它将严重限制您使用数据的能力,并使用数据库功能和设施.

    将其分解为两个独立的数据项:
    column_1 CHAR(1)
    column_2 INTEGER

    然后设置AUTOINCREMENT column_2

    是的,你的主键可以(column_1, column_2),所以你没有失去任何意义c0002.

  2. 切勿将供应商和客户(无论"c"和"s"表示)放在同一张表中.如果你这样做,你将没有数据库表,你将有一个平面文件.由此产生的各种问题和限制.

    这意味着,规范化数据.你最终会得到:

    • 一个表PersonOrganisation包含公共数据的表(Name, Address...)
    • 一个用于Customer包含客户特定数据的表(CreditLimit...)
    • 一个Supplier包含供应商特定数据的表(PaymentTerms...)
    • 没有歧义或可选列,因此没有空
    • 对使用或SQL函数没有限制
      .

    当您需要添加列时,只在需要的位置执行,而不会影响平面文件的所有其他原因.效果范围仅限于变更范围.

  • +1,特别是#2中的建议. (3认同)
  • 呃,你的意思是在column_2上设置AUTOINCREMENT吗?:) (2认同)

mar*_*c_s 9

我的方法是:

  • 创建一个ID INT IDENTITY列并将其用作主键(它是唯一的,窄的,静态的 - 完美的)

  • 如果您确实需要带有字母或其他内容的ID,请根据该创建计算列ID INT IDENTITY

尝试这样的事情:

CREATE TABLE dbo.Demo(ID INT IDENTITY PRIMARY KEY,
                      IDwithChar AS 'C' + RIGHT('000000' + CAST(ID AS VARCHAR(10)), 6) PERSISTED
                     )
Run Code Online (Sandbox Code Playgroud)

该表将包含ID来自1, 2, 3, 4........的值和IDwithChar类似的C000001, C000002, ....., C000042等等.

有了这个,你就拥有了两全其美:

  • 表上适当的,非常适合的主键(和聚类键),非常适合从其他表中引用

  • 你的基于角色的ID,正确定义,计算,总是最新.....

  • ......当它到达`C999999`时,下一个将是...... `C000000` - '呃-哦。下一个 - `C000001`。'什么?再次?!' :) 只是想指出,在可扩展性方面,仅使用 6 位数字并不是很可靠。否则我喜欢这种方法。+1 (3认同)