Eli*_*ias 0 sql sql-server insert
假设我有下表:
CREATE TABLE [ExampleTable]
(
[ExampleID] [int] IDENTITY(1,1) NOT NULL,
[ExampleCompositeNumber] [nvarchar](50) NULL,
CONSTRAINT [PK_Certificates]
PRIMARY KEY CLUSTERED ([ExampleID] ASC)
)
Run Code Online (Sandbox Code Playgroud)
我想要的是[ExampleCompositeNumber]成为ExampleID-[000000-999999]。
我希望这个插入能起作用,但我担心两个人同时插入,并且将错误的 ID 分配给第一部分ExampleCompositeNumber
INSERT INTO ExampleTable (ExampleCompositeNumber)
VALUES (CAST(IDENT_CURRENT('ExampleTable') AS nvarchar(18)) + '-123345')
Run Code Online (Sandbox Code Playgroud)
当我使用SCOPE_IDENTITY()而不是IDENT_CURRENT我得到以前插入的ID,而不是我当前正在制作的插入的ID。以下是该插入内容的示例:
INSERT INTO ExampleTable (ExampleCompositeNumber)
VALUES (CAST(SCOPE_IDENTITY() AS nvarchar(18)) + '-123345')
Run Code Online (Sandbox Code Playgroud)
我的担忧是否正确,或者如果发生多次插入,是否有可能重叠?
一般来说,我建议使用SCOPE_IDENTITY()而不是其他任何东西(比如IDENT_CURRENT()获取新插入的身份值。请参阅此博客文章以获取有关原因的解释)
但在这种情况下,我相信最好的解决方案是使用:
ExampleID INT IDENTITY(1,1)列让 SQL Server 处理您的数值的自动增量所以试试这个:
CREATE TABLE dbo.ExampleTable
(
ExampleID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
ExampleComposite AS 'ExampleID-' +
RIGHT('000000' + CAST(ExampleID AS VARCHAR(6)), 6) + '-123345' PERSISTED,
.... your other columns here....
)
Run Code Online (Sandbox Code Playgroud)
现在,每次插入一行ExampleTable而不指定ExampleID或 的值时ExampleComposite:
INSERT INTO dbo.ExampleTable(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)
Run Code Online (Sandbox Code Playgroud)
那么 SQL Server 就会增加你的ExampleID值,并且ExampleComposite会包含诸如ExampleID-000001-123345、ExampleID-000002-123345、...... 之类的值 - 自动、安全、可靠、无重复。
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |