增加一列且列值为UUID的sql语句

增加一列且列值为UUID的sql语句,第1张

--如果要修改表的结构:
alter table TableName
add uuid varchar(100)
go
--添加唯一约束
alter table TableName
add constraint uin_id unique(uuid)
--赋值
update TableName set uuid = newid()
go
--如果不要修改表结构,可以用临时表来存储并赋值
select ,newid() as uuid into #temp from TableName
go
select from #temp

有的。不过默认的安装并未带这些函数,是需要作为扩展SQL安装上去的。函数名为uuid开头的,类似uuid_generate_xxx。 另外,PostgreSQL从91开始安装的方式有些不同,这些需要再搜索。 我用的PostgreSQL 93, 使用命令create extension "uuid-oos

MYSQL
中表1需要准备大量数据,内容主要取自表2,id必须为32位uuid
(项目所有表都是这样,没办法),
准备这样插入:
1
INSERT
INTO
TBL_ONE
(ID,
SOID,
SNAME)
SELECT
2
REPLACE
(UUID(),
'-',
''),
3
TWOID,
4
TWONAME
5
FROM
6
TBL_TWO
TWO
报错:
Duplicate
entry
'4534c15dc2a111e6a9ab000ec6c596eb'
for
key
'PRIMARY',显然主键冲突了,
REPLACE
(UUID(),
'-',
'')
仅执行了一次,
找了半天,似乎也没有最简单的解决方案。退而求其次,我想到的最简单解决方案:
1
INSERT
INTO
TBL_ONE
(ID,
SOID,
SNAME)
SELECT
2
UUID(),
#UUID()为什么可以?
3
TWOID,
4
TWO
NAME
5
FROM
6
TBL_TWO
TWO;7
8
UPDATE
TBL_ONE
SET
ID
=
REPLACE
(ID,
'-',
'');
uuid()生成的id不会重复,但是会有"-",用空格替换一下就ok了。

提取不重复的数据行,可以使用 select distinct from tab_name。
每列提取唯一值,只能一列列的查询,比如:
select distinct 处名称 from tab_name

你们的想法是不是,想在建表时为id指定uuid,然后每次插入数据都会自动为每一条数据生成uuid呢?就像auto_increment主键自增一样呢?

我只想说 you are too young!

我一开始是这样做的:

create table product(

id varchar(36) primary key default uuid()

sql语句报错。

后来查了查资料,发现mysql好像并不支持在建表时,为某一字段指定默认函数值。但是在Oracle数据库中,却支持这样干,也就可以实现插入数据时,自动生成uuid。

所以在mysql中只能在插入数据时,将uuid()函数值赋值给id字段。

后来,我又想了一个方案,我可以去写一个触发器,每次在执行插入 *** 作时,都为id字段更新为uuid(),但是这种方式还是存在很多问题的,这里就不说了。

最后说明一点(uuid适不适合作为主键):

uuid号称“全球唯一”,实际上业务中一般不会只用一个uuid就保证某个字段的唯一性,因为它并不能保证唯一性,uuid的组成:

Mac地址+时间戳+自增序列,前两个都可以修改,自增序列在不同机器本身就无法保证唯一。既然无法保证唯一,那么没有任何处理的情况下直接将uuid作为主键,显然也是不合适的。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13388492.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-26
下一篇 2023-07-26

发表评论

登录后才能评论

评论列表(0条)

保存