Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tăng giá trị khóa chính tùy chỉnh trong SQL

Trước khi đưa ra giải pháp cho câu hỏi, hãy lưu ý câu hỏi của bạn:

  1. Vì khóa chính tùy chỉnh chủ yếu bao gồm ba phần Ngày (140102), vị trí thực nơi giao dịch diễn ra (entityID), 4 số địa điểm (9999).
  2. Theo thiết kế vào một ngày tại một địa điểm thực tế, không thể có nhiều hơn 9999 giao dịch - Giải pháp của tôi cũng sẽ có cùng một giới hạn.

Một số điểm về giải pháp của tôi

  1. Chữ số 4 vị trí được gắn với ngày có nghĩa là đối với một ngày mới, số lượng bắt đầu từ 0000. Ví dụGI_140102_1_0001, GI_140102_1_0002, GI_140102_1_0003, GI_140103_1_0000, GI_140104_1_0000

Bất kỳ cách nào, trường này sẽ là duy nhất.

  1. Giải pháp so sánh ngày gần nhất trong bản ghi với ngày hiện tại. Logic:Nếu ngày hiện tại và ngày gần nhất trong bản ghi khớp nhau Sau đó, nó tăng 4 chữ số vị trí cho giá trị bằng 1 Nếu ngày hiện tại và ngày mới nhất trong bản ghi không khớp Nó đặt 4 chữ số vị trí bằng giá trị 0000.

Giải pháp:(Mã dưới đây cung cấp giá trị sẽ là Hàng hóa hướng tới tiếp theo, Sử dụng nó theo yêu cầu để phù hợp với giải pháp của bạn)

declare @previous nvarchar(30);
declare @today nvarchar(30);
declare @newID nvarchar(30);
select @previous=substring(max(GoodsInwardId),4,6) from SC_TD_GoodsInward;
Select @today=RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2);

if @[email protected]
BEGIN
Select @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
+'_'+CONVERT(varchar,1)+'_'+(SELECT RIGHT('0000'+
CONVERT(VARCHAR,CONVERT(INT,RIGHT(MAX(GoodsInwardId),4))+1),4) 
from SC_TD_GoodsInward);
END
else
BEGIN
SET @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
+'_'+CONVERT(varchar,1)+'_0000';
END
select @newID;

T-SQL để tạo cấu trúc bắt buộc (Đoán có thể xảy ra)

Đối với bảng:

CREATE TABLE [dbo].[SC_TD_GoodsInward](
    [EntityId] [int] NULL,
    [GoodsInwardId] [nvarchar](30) NULL
)

Bản ghi mẫu cho bảng:

insert into dbo.SC_TD_GoodsInward values(1,'GI_140102_1_0000');
insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_9999');
insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_0001');

** Đó là một giải pháp có thể xảy ra trong trường hợp của bạn mặc dù giải pháp hoàn hảo sẽ là có cột nhận dạng (sử dụng được gửi lại nếu cần) và gắn nó với ngày hiện tại dưới dạng cột được tính toán.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay thế toàn bộ từ bằng cách sử dụng thay thế máy chủ ms sql

  2. Những quyền nào được yêu cầu để chèn hàng loạt vào SQL Server từ một mạng chia sẻ với xác thực Windows?

  3. Làm tròn mili giây trong T-SQL

  4. Cách tránh tình trạng chạy đua cơ sở dữ liệu khi tăng PK của hàng mới theo cách thủ công

  5. Đăng xuất kiểm tra trong SQL Server Profiler là gì?