-
DB2在原来的表里添加联合主键,添加非空列的方法
2019-01-23 15:00:32#大家都知道,我们的主键是不为空的,但是这时候我们要添加一个字段,与原有的主键组成联合主键,这个字段往往我们需要把它设置成一个非空的字段 这里有个坑如果原有的表里面是有数据的,这是时候直接使用语句进行...#大家都知道,我们的主键是不为空的,但是这时候我们要添加一个字段,与原有的主键组成联合主键,这个字段往往我们需要把它设置成一个非空的字段
这里有个坑如果原有的表里面是有数据的,这是时候直接使用语句进行字段的添加并设置为not null是不可以的,会报错!那么怎么解决呢!分为以下几个步骤一一进行即可:
比如:我们要在TABLE_EMPLOYEE中添加一个字段USER_ID与之前的EMPLOYEE_ID作为联合主键(假设原表中有值):**1.创建列:** alter table TABLE_EMPLOYEE add column USER_ID varchar(30); **2.在DB2的服务端用cmd中对此表进行重构(没有重构会报错-668):** reorg table <TABLE_EMPLOYEE> **3.向此列中添加值,这里可以不用where条件,因为我们的目的就是想把此列的数据全部填充为非空:** update TABLE_EMPLOYEE set USER_ID='DWEFEWF'; **4.设置USER_ID为非空:** alter table TABLE_EMPLOYEE alter USER_ID set not null; 上面的设置字段为空的方法就解决了,下面就开始设置联合主键了 **5.删除原有的联合主键:** ALTER TABLE TABLE_EMPLOYEE DROP primary key ; **6.重复第二步操作:** reorg table <TABLE_EMPLOYEE> **7.添加联合主键:** alter TABLE TABLE_EMPLOYEE add constraint PK_FK primary key(EMPLOYEE_ID,USER_ID);
不经常写博客,所以不太会组织语言,但希望可以解决您的问题,坑已认真踏过,请放心使用!
-
mysql如何修改非空约束_mysql主键非空约束怎么设置?
2021-02-02 07:23:20mysql中可以通过在“CREATE TABLE”语句中,使用“ PRIMARY KEY [默认值]”语句来设置主键...一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。使用主键应注意以下几点:每个表只能定...mysql中可以通过在“CREATE TABLE”语句中,使用“ PRIMARY KEY [默认值]”语句来设置主键约束,使用“ NOT NULL”语句来设置非空约束。
mysql主键约束
主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。
使用主键应注意以下几点:每个表只能定义一个主键。
主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。
一个字段名只能在联合主键字段表中出现一次。
联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。
在创建表时设置主键约束
在创建数据表时设置主键约束,既可以为表中的一个字段设置主键,也可以为表中多个字段设置联合主键。但是不论使用哪种方法,在一个表中主键只能有一个。下面分别讲解设置单字段主键和多字段联合主键的方法。
1)设置单字段主键
在 CREATE TABLE 语句中,通过 PRIMARY KEY 关键字来指定主键。
在定义字段的同时指定主键,语法格式如下: PRIMARY KEY [默认值]
例 1
在 test_db 数据库中创建 tb_emp3 数据表,其主键为 id,SQL 语句和运行结果如下。mysql> CREATE TABLE tb_emp3
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_emp3;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptId | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)
或者是在定义完所有字段之后指定主键,语法格式如下:[CONSTRAINT ] PRIMARY KEY [字段名]
例 2
在 test_db 数据库中创建 tb_emp4 数据表,其主键为 id,SQL 语句和运行结果如下。mysql> CREATE TABLE tb_emp4
-> (
-> id INT(11),
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_emp4;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptId | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)
2)在创建表时设置联合主键
所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
比如,设置学生选课数据表时,使用学生编号做主键还是用课程编号做主键呢?如果用学生编号做主键,那么一个学生就只能选择一门课程。如果用课程编号做主键,那么一门课程只能有一个学生来选。显然,这两种情况都是不符合实际情况的。
实际上设计学生选课表,要限定的是一个学生只能选择同一课程一次。因此,学生编号和课程编号可以放在一起共同作为主键,这也就是联合主键了。
主键由多个字段联合组成,语法格式如下:PRIMARY KEY [字段1,字段2,…,字段n]
注意:当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
例 3
创建数据表 tb_emp5,假设表中没有主键 id,为了唯一确定一个员工,可以把 name、deptId 联合起来作为主键,SQL 语句和运行结果如下。mysql> CREATE TABLE tb_emp5
-> (
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> PRIMARY KEY(id,deptId)
-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_emp5;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(25) | NO | PRI | NULL | |
| deptId | int(11) | NO | PRI | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.14 sec)
在修改表时添加主键约束
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。但是需要注意的是,设置成主键约束的字段中不允许有空值。
在修改数据表时添加主键约束的语法格式如下:ALTER TABLE ADD PRIMARY KEY();
查看 tb_emp2 数据表的表结构,SQL 语句和运行结果如下所示。mysql> DESC tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(30) | YES | | NULL | |
| deptId | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)
例 4
修改数据表 tb_emp2,将字段 id 设置为主键,SQL 语句和运行结果如下。mysql> ALTER TABLE tb_emp2
-> ADD PRIMARY KEY(id);
Query OK, 0 rows affected (0.94 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| deptId | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.12 sec)
通常情况下,当在修改表时要设置表中某个字段的主键约束时,要确保设置成主键约束的字段中值不能够有重复的,并且要保证是非空的。否则,无法设置主键约束。
mysql非空约束
MySQL 非空约束(NOT NULL)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空。
比如,在用户信息表中,如果不添加用户名,那么这条用户信息就是无效的,这时就可以为用户名字段设置非空约束。
在创建表时设置非空约束
创建表时可以使用 NOT NULL 关键字设置非空约束,具体的语法格式如下: NOT NULL
例 1
创建数据表 tb_dept4,指定部门名称不能为空,SQL 语句和运行结果如下所示。mysql> CREATE TABLE tb_dept4
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22) NOT NULL,
-> location VARCHAR(50)
-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_dept3;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.06 sec)
在修改表时添加非空约束
如果在创建表时忘记了为字段设置非空约束,也可以通过修改表进行非空约束的添加。
修改表时设置非空约束的语法格式如下:ALTER TABLE
CHANGE COLUMN
NOT NULL;
例 2
修改数据表 tb_dept4,指定部门位置不能为空,SQL 语句和运行结果如下所示。mysql> ALTER TABLE tb_dept4
-> CHANGE COLUMN location
-> location VARCHAR(50) NOT NULL;
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept4;
+----------+-------------+------+-----+----------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+----------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | NO | | NULL | |
+----------+-------------+------+-----+----------+-------+
3 rows in set (0.00 sec)
推荐教程:mysql视频教程
-
主键和外键举例_mysql 基础篇之主键和外键
2021-01-14 03:52:51前言前面几篇 blog,主要简单介绍了在 MySQL 数据库中如何查看某张表,以及对表做一些增删改查的操作,本篇 blog 主要介绍一张表中如何设置唯一标识,以及两张表之间如何关联,即我们日常听说的主键和外键主键含义:...前言
前面几篇 blog,主要简单介绍了在 MySQL 数据库中如何查看某张表,以及对表做一些增删改查的操作,本篇 blog 主要介绍一张表中如何设置唯一标识,以及两张表之间如何关联,即我们日常听说的主键和外键
主键
含义:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键
举例说明:
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键
创建两张表,并插入数据
1 员工表emp(student)
字段如下:
员工号(sid)
姓名(sname)
年龄(sage)
工资(sal)
部门号(deptno)
2 部门表(department)
1 部门号(deptno)
2 部门地址(address)
3 部门电话(detel)
可能遇到的问题
在给部门表插入数据的时候,address 字段插入的是中文,但最后显示为?
解决方法:在创建部门表的时候指定编码
create table department
(deptno int,address varchar(100),detel char(20)
)DEFAULT CHARSET=utf8;
添加主键约束
alter table emp
add constraint pk_emp
primary key(sid);
alter table department
add constraint pk_department
primary key(deptno);
查看主键
语句:desc 表名;
外键
含义:外键用于与另一张表的关联,是能确定另一张表记录的字段,用于保持数据的一致性
举例说明
员工表emp(员工号,姓名,性别,薪水,部门号) (主键员工号,外键部门号)
部门表department(部门号,部门地址,部门电话) (主键部门号)
添加外键约束
alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名);
添加外键约束实例
小插曲:笔者昨日搞好久都无法创建外键,当时也没百度,今天才发现原来是自己的外表 department 没有插入数据。。。。
alter table emp add constraint FK_ID foreign key(deptno) REFERENCES department(deptno);
查看外键
输入命令:show create table 表名;
删除主键
命令:alter table emp drop primary key;
删除外键
命令:alter table emp drop foreign key deptno;
注意:删除外键 deptno 后,才能修改主表 emp 的数据
以上,over
原创申明:以上内容都是笔者个人经验,仅供参考,如需转载,请注明出处
-
mysql主键加标识列_mysql中标识列是什么意思有什么用
2021-01-14 15:23:29标识列又称为自增长列,在mysql的表格字段属性中有个标识列的属性,功能是实现表格...不一定,但要求是一个key2、一个表可以有几个标识列?至多一个!3、标识列的类型只能是数值型4、标识列可以通过 SET auto_incre...标识列又称为自增长列,在mysql的表格字段属性中有个标识列的属性,功能是实现表格数据的自增值,一个表格仅一个标识列,可以设置步长,默认为1。
标识列是什么?
标识列又称为自增长列。
含义:可以不用手动的插入值,系统提供默认的序列值
特点:
1、标识列必须和主键搭配吗?不一定,但要求是一个key
2、一个表可以有几个标识列?至多一个!
3、标识列的类型只能是数值型
4、标识列可以通过 SET auto_increment_increment=3;设置步长
创建表时设置标识列 AUTO_INCREMENTDROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT,
NAME FLOAT UNIQUE AUTO_INCREMENT,
seat INT
);
TRUNCATE TABLE tab_identity;
INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');
SELECT * FROM tab_identity;
SHOW VARIABLES LIKE '%auto_increment%';
生成列(包括标识列)是 DB2 的一个重要的特性,用来自动生成列值。一个生成列的值不是由 INSERT 或者 UPDATE 操作派生,而是根据预定义由 DB2 自动生成。在应用程序中,用户可以根据不同的需求选择不同的生成列从而简化应用程序的开发或提高。
DB2 的生成列(GENERATED COLUMNS)由 CREATE TABLE 或 ALTER TABLE 语句中的 GENERATED ALWAYS AS ... 子句创建。
DB2 的生成列的值由用户定义的表达式产生,DB2 根据表达式来计算生成列的列值。在应用程序自定义生成列时,需要在 CREATE TABLE 或者 ALTER TABLE 语句中指定 GENERATED AS EXPRESSION 语句。
-
elasticsearch 学习博客系列<二> ES 中 index 设置 Mapping(表结构)
2017-06-01 22:40:30type: 相当于数据库里的一个表。 id: 唯一,相当于主键。 node:节点是es实例,一台机器可以运行多个实例,但是同一台机器上的实例在配置文件中要确保http和tcp端口不同(下面有讲)。 cluster:代表一个集群... -
【MySQL】——自增主键ID
2020-08-15 17:11:03mysql数据库中有一个主键生成规则,就是自增。本文就给大家从几个维度说明一下mysql自增主键。 二、主键设置原则 主键不可修改 对于数据库来说,主键其实是可以修改的,只要不和其他主键冲突就可以。但是,对于... -
MySQL主键自增长报duplicate_mysql 使用ON DUPLICATE KEY UPDATE 时导致的自增主键id无限增大问题...
2021-01-28 20:40:25mysql 版本:5.7python版本:3.7问题描述:mysql表A中数据有几十条,设置了一个自增 1 的id作为主键,在程序运行一段时间后发现表中最后一条数据的id已经是几百万了表中所有数据如下:可以看到最大的一条id已经是四... -
如何创建一张表mysql_如何用MySQL创建你的第一张表
2021-01-25 12:26:03主键在了解语法之前,先要了解几个概念。第一个是“主键”。如果一列的值可以唯一区分表中的每一行,那么这个列就是主键。光看概念可能没那么容易理解,来举一个例子吧。例如:对于一张学生成绩表,学号就可以设置成... -
关于Hibernate主键包含null值的改动方案
2006-08-24 13:10:00前言最近公司跟另外一个公司...命题数据表中设置为主键的两个字段其中一个可以为空。分析经过分析,Hibernate3.0的beta1~3支持可以为空的主键,但是之后就不再支持。同时,oracle也不支持可以为null的主键,在建表的过 -
mysql插入数据方式有几种_经验:在MySQL数据库中,这4种方式可以避免重复的插入数据!...
2021-02-08 10:28:34作者:小小猿爱嘻嘻wukong.com/question/6749061190594330891/最常见的方式就是...下面我简单介绍一下,感兴趣的朋友可以尝试一下:这里为了方便演示,我新建了一个user测试表,主要有id,username,sex,address这... -
变态工作之修改hibernate让其支持null主键
2006-07-09 13:46:00关于Hibernate主键包含null值的改动方案 前言最近公司跟另外一个公司...数据表中设置为主键的两个字段其中一个可以为空。 分析 经过分析,Hibernate3.0的beta1~3支持可以为空的主键,但是之后就不再支持。同时,... -
mysql duplicate id_mysql 使用ON DUPLICATE KEY UPDATE 时导致的自增主键id无限增大问题
2021-01-19 05:29:41mysql 版本:5.7python版本:3.7问题描述:mysql表A中数据有几十条,设置了一个自增 1 的id作为主键,在程序运行一段时间后发现表中最后一条数据的id已经是几百万了表中所有数据如下:可以看到最大的一条id已经是四... -
Hibernate中的映射关系(一)
2016-04-27 21:37:00在Hibernate的学习中,最最主要的就是Hibernate中的几种常用的映射关系了。...实现方式的原理很简单,就是将Person表和IDCard表的主键设置成一致的,这样就可以使得Person表中的每条记录都与IDCard表中的记录唯一对应 -
mysql 设置参照完整性
2015-08-21 17:17:00简单的来说,就是在A表里面有一组属性K(可以是多个)是A表的主键,在B表中有一组对应的属性F(也可以是多个),但F不是B表主键,则对于B表中每个元组(也就是每一行)在F上的值必须为空值或者等于A表中某个元组(某... -
002 如何建立数据表?如何查询数据库?
2019-05-07 16:22:181. 常见的几种数据表映射关系 一对一:一本书对应一个价格。 一对多:一本书对应很多条评论。...一本书可以被评论很多次(被多人评论),在Review表中设置外键指向Book的主键,这是典型的一对多的关系。 ... -
如何能在多个web服务器1个DB的情况下保证数据唯一?
2009-08-19 21:02:18公司里做的项目, 打算用多个web服务器, 共同连一个DB, 在某个基础表里的数据需要逻辑唯一, 既某对象(attr1="a", attr2="b")在数据库里只能存在一条记录, 由于这个基础表在用户使用中是用户自定义的, 因此有可能a,b2... -
自己编写存储过程对Oracle中的序列进行重置
2019-09-25 07:10:56SQL Server和Oracle数据库在设置表的主键的时候有一个很重要的区别,SQL Server可以通过自带的自增数据类型设置一个表的主键,而Oracle则必须借助于数据库中的序列实现自增的数据类型,这两种方式有以下几种区别: ... -
es的index库建立和设置对应的属性mapping
2018-10-24 12:27:49type: 相当于数据库里的一个表。 id: 唯一,相当于主键。 node:节点是es实例,一台机器可以运行多个实例,但是同一台机器上的实例在配置文件中要确保http和tcp端口不同。 cluster:代表一个集群,集群中有多... -
数据库设计的几条规范
2020-06-02 13:31:53数据库设计在平时的工作是必不可少的,良好的表设计可以让我们查询效率更高,加快网站访问速度,提升用户体验,并且方便于我们查询数据。下面就总结一下,如何设计出高可复用,优良的表结构,从而在实际的工作中使... -
InnoDB存储引擎使用的几点建议和最佳实践
2019-07-30 15:09:06为每一张表最经常访问的一个或多个列设置主键索引,如果没有很明显的主键字段,可以使用一个自增字段作为主键索引。 根据多张表中相同的ID值,使用JOIN从这些表中提取数据时。如果想获得最高的JOIN性能,在JOIN... -
SQL:已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行
2013-03-30 20:53:00在进行SQL数据库维护时,发现有几行记录明显有错误却...问题原因在于建立的几个表都没有关键字,设置好关键字后问题解决。 方法一:这种问题大多由于没有主键引起,可以通过另外加一列主键解决 1、添加主键 A... -
数据库常用知识
2018-06-05 11:43:00主键和联合主键其实很简单,你就知道一下几点就可以了,在以后的工作中...该属性应为其中一个表的主键,在另外一个表设置为外键。约束内表的数据的插入和更新,从定义外键时可以发现 外键是和主键表联系,数据类型要... -
基础SQL第二课:约束
2021-01-09 16:27:39理论上来说每一个数据表都必须有一个唯一主键作为数据的唯一标识,设置主键的列不允许为空,主键习惯 id 表示,可以在创建数据时直接指定,也可以通过修改表结构直接添加,设置为主键的列在添加数据时不能重复,既... -
Eclipse快速上手Hibernate--5. 关联映射(一对一)
2005-04-28 12:15:00Hibernate中的关联(Association)映射主要有三种:一对一关联,一对多(或多对一)关联,多对多关联。... 一对一关联有两种映射方式:一种是使用主键关联,限制两个数据表的主键使用相同的值;另一 -
Eclipse快速上手Hibernate--6. 关联映射(一对一)
2005-04-27 22:23:00Hibernate中的关联(Association)映射主要有三种:一对一关联,一对多(或多对一)关联,多对多关联。每种关联都可以分为单向和... 一对一关联有两种映射方式:一种是使用主键关联,限制两个数据表的主键使用相同的值
-
NFS 实现高可用(DRBD + heartbeat)
-
一起看看 Activity启动模式
-
Cmake 教程
-
ScrapytIems.py
-
Amoeba 实现 MySQL 高可用、负载均衡和读写分离
-
C52-源码
-
利用坐标变换分析塔差对编码器测角精度测试的影响
-
Mycat 实现 MySQL的分库分表、读写分离、主从切换
-
碳中和目标下A股先锋调研:钢铁行业加速碳达峰 多行业影响已现
-
02-27 windows下MySQL安装流程
-
精益开发治理的最佳实践,第2部分:过程和度量
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
jquery使用serialize()出现中文乱码怎么办
-
CSRFTester:一款CSRF漏洞的安全测试工具
-
Employee_Tracker_ManageYourCompany:BCS家庭作业周12-源码
-
标量PML-FDTD算法在弱导光器件仿真中的应用
-
迪普食品-源码
-
编程和游戏
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
MxsDoc运行环境(Windows)