mysql创建数据库时怎么将主键设置为UUID,建表语句怎么写

mysql创建数据库时怎么将主键设置为UUID,建表语句怎么写,第1张

mysql设置UUID为主散敏键需要先将数中滚据类型设置为VARCHAR(36),卖掘余然后插入数据的时候用UUID函数插入UUID。下面我用win10系统下的CMD命令行具体演示一下:

1、打开CMD,输入mysql -uroot -p命令连接mysql,如下图所示

2、通过create创建表,指定ID为varchar(36),并设置为主键,如下图所示

3、在插入数据的时候,调用uuid()函数往主键字段里插入uuid值,如下图所示

4、最后查询插入的数据就可以看到id主键列存放的是uuid类型了,如下图所示

1、主键定义

表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。

2、主键作用

1)保证实体的完整性

2)加快数据库的 *** 作速度

3) 在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。

4) 数据库自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

3、主键的必要性

在有些数据库中,虽然主键不是必需的,但最好为每个表都设置一个主键,不管是单主键还是复合主键。它蚂扒坦存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除。

4、主键的选择

1)编号作主键

此方法就是采用实际业务中的唯一字段的“编号”作为主键设计,这在小型的项目中是推荐这样做的,因为这可以使项目比较简单化,但在使用中却可能带来一些麻烦,比如要进行“编号修改”时,可能要涉及到很多相关联的其他表

2)自动编号主键

这种方法也是很多人在使用的,就是新建一个ID字段,自动增长,非常方便也满足主键的原则

a、优点:数据库自动编号,速度快,而且是增量增长,聚集型主键按顺序存放,对于检索非常有利数字型的,占用空间小,易排序,在程序中传递也方便如果通过非系统增加记录(比如手动录入,或是用其他工具直接在表里插入新记录,或老系统数据导入)时,非常方便,不用担心主键重复问题。

b、缺点:其实缺点也就是来自其优点,就是因为自动增长,在手动要插入指定ID的记录时会显得麻烦,尤其是当系统与其他系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突(前提是老系统也是数字型的)如果其他系统主键不是数字型那就麻烦更大了,会导致修改主键数据类型了此桥,这也会导致其他相关表的修改,后果同样很严重就算其他系统也是数字型的,在导入时,为了区分新老数据,可能想在老数据主键前统一加一个“o”(old)来表示这是老数据,那么自动增长的数字型又面临一个挑战。

3)Max加一

由于自动编号存在那些问题,所以有些人就采用自己生成,同样是数字型的,只是把自动增长去掉了,采用在Insert时,读取Max值后加一,这种方法可以避免自动编号的问题,但也存在一个效率问题,如果记录非常大的话,那么Max()也会影响效率的更严重的是并发性问题,如果同时有两人读到相同的Max后,加一后插入的ID值会重复,这已经是有经验教训的了。

4)自制加一

考虑Max加一的效率后,有人采用自制加一,也就是建一个特别的表,字段为:表名,当前序列值。这样在往表中插入值时,先从此表中找到相应表的最大值后加一,进行插入,有人可能发现,也可能会存在并发处理,这个并发处理,可以采用lock线程的方式来避免,在生成此值的时,先Lock,取到值以后,再unLock出来,这样不会有两人同时生成了。这比Max加一的速度要快多了。但同样存在一个问题:在与其他系统集成时,脱离了系统中的生成方闷桐法后,很麻烦保证自制表中的最大值与导入后的保持一致,而且数字型都存在上面讲到的“o”老数据的导入问题。因此在“自制加一”中可以把主键设为字符型的。字符型的自制加一中应该字符型主键可以应付很多我们意想不到的情况。

5)GUID主键

目前一个比较好的主键是采用GUID,推荐主键还是字符型的,但值由GUID生成,GUID是可以自动生成,也可以程序生成,而且键值不可能重复,可以解决系统集成问题,几个系统的GUID值导到一起时,也不会发生重复,就算有“o”老数据也可以区分,而且效率很高,在.NET里可以直接使用System.Guid.NewGuid()进行生成,在SQL里也可以使用NewID()生成。优点是:

同IDENTITY 列相比,uniqueidentifier 列可以通过NewID() 函数提前得知新增加的行ID,为应用程序的后续处理提供了很大方便。

a、优点:便于数据库移植,其它数据库中并不一定具有IDENTITY 列,而Guid 列可以作为字符型列转换到其它数据库中,同时将应用程序中产生的GUID 值存入数据库,它不会对原有数据带来影响。便于数据库初始化,如果应用程序要加载一些初始数据,IDENTITY 列的处理方式就比较麻烦,而uniqueidentifier 列则无需任何处理,直接用T-SQL 加载即可。便于对某些对象或常量进行永久标识,如类的ClassID,对象的实例标识,UDDI 中的联系人、服务接口、tModel标识定义等。

b:缺点是:

GUID 值较长,不容易记忆和输入,而且这个值是随机、无顺序的

GUID 的值有16 个字节,与其它那些诸如4 字节的整数相比要相对大一些。这意味着如果在数据库中使用uniqueidentifier 键,可能会带来两方面的消极影响:存储空间增大;索引时间较慢。

新建表:

create table [表名]

(

[自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,

[字段1] nVarChar(50) default \'默认值\' null ,

[字段2] ntext null ,

[字段3] datetime,

[字段4] money null ,

[字段5] int default 0,

[字段6] Decimal (12,4) default 0,

[字段7] image null ,

)

删除表:

Drop table [表名]

插入数据:

INSERT INTO [表名] (字段1,字段2) VALUES (100,\'51WINDOWS.NET\')

删除数据:

DELETE FROM [表名] WHERE [字段名]>100

更新数据:

UPDATE [表名] SET [字段1] = 200,[字段2] = \'51WINDOWS.NET\' WHERE [字段三] = \'HAIWA\'

新增字段:

ALTER TABLE [表名] ADD [字段名] NVARCHAR (50) NULL

删除字段:

ALTER TABLE [表名] DROP COLUMN [字段名]

修改字段:

ALTER TABLE [表名] ALTER COLUMN [字段名] NVARCHAR (50) NULL

重命名表:(Access 重命名表,请参考文章:在Access数据库中重命名表)

sp_rename \'表名\', \'新表名\', \'OBJECT\'

新建约束:

ALTER TABLE [表名] ADD CONSTRAINT 约束名 CHECK ([约束敏弊字段] <= \'2000-1-1\')

删除约束:

ALTER TABLE [表名] DROP CONSTRAINT 约束名

新建默认值

ALTER TABLE [表名] ADD CONSTRAINT 默认值名 DEFAULT \'51WINDOWS.NET\' FOR [字段名]

删除默认值

ALTER TABLE [表名] DROP CONSTRAINT 默认值名

删除Sql Server 中的日志,减小数让槐据库文件大小

dump transaction 数据库名 with no_log

backup log 数据库名 with no_log

dbcc shrinkdatabase(数据库名)

exec sp_dboption \'数据库名\', \'autoshrink\', \'true\'

\\\'添加字段通用函数

Sub AddColumn(TableName,ColumnName,ColumnType)

Conn.Execute(\"Alter Table \"&TableName&\" Add \"&ColumnName&\" \"&ColumnType&\"\")

End Sub

\\\'更改字段通用函数

Sub ModColumn(TableName,ColumnName,ColumnType)

Conn.Execute(\"Alter Table \"&TableName&\" Alter Column \"&ColumnName&\" \"&ColumnType&\"\")

End Sub

\\\'检查表是否存在

sql=\"select count(*) as dida from sysobjects where id = object_id(N\桥滑族'[所有者].[表名]\') and OBJECTPROPERTY(id, N\'IsUserTable\') = 1\"

set rs=conn.execute(sql)

response.write rs(\"dida\")\'返回一个数值,0代表没有,1代表存在

判断表的存在:

select * from sysobjects where id = object_id(N\'[dbo].[tablename]\') and OBJECTPROPERTY(id, N\'IsUserTable\') = 1

某个表的结构

select * from syscolumns where id = object_id(N\'[dbo].[你的表名]\') and OBJECTPROPERTY(id, N\'IsUserTable\') = 1


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

原文地址: https://outofmemory.cn/bake/11979131.html

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

发表评论

登录后才能评论

评论列表(0条)

保存