重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
mysql设置主键的代码是PRIMARY KEY (主键字段)。
站在用户的角度思考问题,与客户深入沟通,找到望奎网站设计与望奎网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站建设、成都网站制作、企业官网、英文网站、手机端网站、网站推广、域名申请、雅安服务器托管、企业邮箱。业务覆盖望奎地区。
如:CREATE TABLE Customer (SID integer,Last_Name varchar(30),First_Name varchar(30),PRIMARY KEY (SID))。
主关键字(主键,primary key)是被挑选出来,作表的行的唯一标识的候选关键字。一个表只有一个主关键字。主关键字又可以称为主键。
扩展资料:
永远也不要更新主键。实际上,因为主键除了唯一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
主键应当由计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了唯一标识一行以外的意义。一旦越过这个界限,就可能产生人为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。
工具/原料
电脑
MySQL
方法/步骤
设置主键:
1、通过终端进入到mysql命令行工具。
2、通过use关键字进行到目标数据库里。
3、如原表已有主键,先把原来的主键删除掉,通过DROP
PRIMARY
KEY命令:ALTER
TABLE
`jingyan`
DROP
PRIMARY
KEY;。
4、主键已经没有了。
5、通过命令:ADD
PRIMARY
KEY来添加ALTER
TABLE
`jingyan`
ADD
PRIMARY
KEY
(
`id`
)
。
6、输入后按下回车键即可看到
query
ok执行成功的字符。
7、回到数据库的可视化工具,即可显示现在的表在id列上添加了主键了。
设置外键:
1、创建好主从表。
2、选择主表,点击设计表,进入到表设计界面。
3、点击外键,进入到外键设置界面。
4、先设置外键名称和选择主表的外键字段。
5、然后在设置外键字段对应从表的数据库、表名和字。
6、点击保存就完成外键设置了。
自增?
主键自增:
CREATE TABLE test
(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(15) NOT NULL
)AUTO_INCREMENT = 100;
可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。
alter table tbname auto_increment = x ;
设置表tbname的唯一auto_increment字段起始值从x开始,如果此表数据量很多的话,这样执行起来会很慢
AUTO_INCREMENT说明:
(1)如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。
(2)把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。
(3)当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。
(4)当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。
(5)如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。
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、打开navicat工具,连接上mysql服务器,选择完数据库之后,选择一个表右击选择设计表(这里为了演示测试,随便选择一个表即可)。
2、在设计表页面,可以看到当前表的所有字段信息,我们选择的学生表有一个id字段,目前该表没有主键字段。
3、如图,在最后一列右击选择主键,即可将该字段设置为主键,也可以直接点击鼠标左键,可以快速添加和取消主键。
4、设置完主键之后,可以看到一把锁的标志,并且有一个1字,因为一个表可以给多个字段添加主键,则为联合主键,这样就显示为主键1,主键2等。
5、主键设置完成之后,还没有自增,选择id字段之后,在下方,如图,勾选自动递增,这样id在每次插入记录之后都会自增一个值。
6、设置完成主键和自增之后,点击保存,关闭当前窗口,然后选择表名右击选择对象信息。
7、在DLL页面中,可以看到刚刚添加的主键和自增的DLL语句,这里就是创建表的DLL语句。
8、上面有提到联合主键,其实一个表可以给多个字段设置主键,这样可以组成联合主键,对于特定的业务,联合主键也是必须的。
mybatis自增主键配置:
mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在mybatis中对于自增主键的配置。
1、不返回自增主键值:
如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。
Oracle Sequence 配置
sql id='TABLE_NAME'TEST_USER/sql
sql id='TABLE_SEQUENCE'SEQ_TEST_USER_ID.nextval/sql
!-- 注意这里直接调用sequence的nextval函数 --
insert id="insert" parameterType="User"
insert into include refid="TABLE_NAME" / (ID,NAME,AGE)
values ( include refid="TABLE_SEQUENCE" / ,#{name}, #{age} )
/insert
当插入语句如上配置时,那么针对如下语句
User user = new User();
user.setName("test");
user.setAge(24);
userMapper.insert(user);
System.out.println(user.id); // user.id 为空
user.id为空,也就是说如上的配置并不能在完成插入操作后将插入时的主键值存放到保存的对象中。
2、Mysql自增主键配置
由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。
sql id='TABLE_NAME'TEST_USER/sql
!-- 注意这里的插入SQL中是没有指明ID字段的! --
insert id="insert" parameterType="User"
insert into include refid="TABLE_NAME" / (NAME,AGE)
values (#{name}, #{age} )
/insert
同样,针对Mysql如此配置mybaits,插入完成后user.id为空。
插入后获取自增主键值:
上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的selectKey /来单独配置针对自增逐渐的处理。
1、Oracle Sequence 配置:
sql id='TABLE_NAME'TEST_USER/sql
sql id='TABLE_SEQUENCE'SEQ_TEST_USER_ID.nextval/sql
!-- 注意这里需要先查询自增主键值 --
insert id="insert" parameterType="User"
selectKey keyProperty="id" resultType="int" order="BEFORE"
select include refid="TABLE_SEQUENCE" / from dual
/selectKey
insert into include refid="TABLE_NAME" / (ID,NAME,AGE)
values ( #{id}, #{name}, #{age} )
/insert
当使用了selectKey /后,在实际的插入操作时,mybatis会执行以下两句SQL:
select SEQ_TEST_USER_ID.nextval from dual; // 语句1
insert into (ID,NAME,AGE) values ( ?, ?, ? ); // 语句2
在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后
User user = new User();
user.setName("test");
user.setAge(24);
userMapper.insert(user);
System.out.println(user.id); // user.id 不为空
user.id是有值的。
2、Mysql自增主键配置
针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,
sql id='TABLE_NAME'TEST_USER/sql
insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User"
insert into include refid="TABLE_NAME" / ( NAME, AGE )
values ( #{name}, #{age} )
/insert
当然,由于Mysql的自增主键可以通过SQL语句
select LAST_INSERT_ID();
来获取的。因此针对Mysql,Mybatis也可配置如下:
sql id='TABLE_NAME'TEST_USER/sql
!-- 注意这里需要先查询自增主键值 --
insert id="insert" parameterType="User"
selectKey keyProperty="id" resultType="int" order="BEFORE"
SELECT LAST_INSERT_ID()
/selectKey
insert into include refid="TABLE_NAME" / (ID,NAME,AGE)
values ( #{id}, #{name}, #{age} )
/insert
只不过该中配置需要额外的一条查询SQL
小结
当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.
当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.