我想知道是否可以在MS SQL
中创建一个id为base64
且自动递增的表?
现在我们可以做这样的事情
create table tb(
_id int identity(1,1)
)
但是这样的事情呢?
create table tb(
_id base64 identity(1,1)
)
答案 0 :(得分:1)
只是概念证明:
创建功能:
CREATE FUNCTION [TempFunc]
(
@Id int
)
RETURNS nvarchar(max)
AS
BEGIN
DECLARE @Id_Binary varbinary(MAX) = CONVERT(varbinary(64), @Id)
RETURN CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@Id_Binary"))', 'VARCHAR(MAX)')
END
创建表格:
CREATE TABLE Temp (
Id int IDENTITY(1,1),
[Id_Base64] AS (dbo.TempFunc(Id)),
Value nvarchar(max)
)
使用:
INSERT INTO Temp
VALUES
(N'aaaa'),
(N'bbbb'),
(N'cccc')
SELECT *
FROM Temp AS t
Id Id_Base64 Value
----------- ---------- ----------
1 AAAAAQ== aaaa
2 AAAAAg== bbbb
3 AAAAAw== cccc
或者,使用NEWSEQUENTIALID():
CREATE TABLE #Temp(
Id uniqueidentifier DEFAULT(NEWSEQUENTIALID()),
Value nvarchar(10)
)
INSERT INTO #Temp
([Value])
VALUES
(N'aaaa'),
(N'bbbb'),
(N'cccc')
SELECT *
FROM #Temp AS t
Id Value
------------------------------------ ----------
A6FD44E0-E611-E611-80E9-001DD8B71C43 aaaa
A7FD44E0-E611-E611-80E9-001DD8B71C43 bbbb
A8FD44E0-E611-E611-80E9-001DD8B71C43 cccc
答案 1 :(得分:1)
您可以创建视图,而不是计算列:
CREATE TABLE tb(
_id INT IDENTITY(1,1)
,col VARCHAR(10)
);
INSERT INTO tb(col) VALUES ('a'),('b'),('c'),('d');
GO
CREATE VIEW my_view AS
SELECT *
FROM tb t
CROSS APPLY (SELECT CAST(_id AS VARBINARY(MAX))
FOR XML PATH(''), BINARY BASE64) s(base64_id);
GO
SELECT * FROM my_view;
的 LiveDemo
强>
输出:
╔═════╦═════╦═══════════╗
║ _id ║ col ║ base64_id ║
╠═════╬═════╬═══════════╣
║ 1 ║ a ║ AAAAAQ== ║
║ 2 ║ b ║ AAAAAg== ║
║ 3 ║ c ║ AAAAAw== ║
║ 4 ║ d ║ AAAABA== ║
╚═════╩═════╩═══════════╝
和YouTube一样,我在网址中有一个ID,我不希望人们只是递增该ID以便浏览所有项目。与YouTube不同,我没有“万亿”项目
然后base64
根本不会保护你。 IDENTITY
本质上是增量的,掩盖它很容易克服。