oracle数据库创建表时,int型数据为何报错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库创建表时,int型数据为何报错相关的知识,希望对你有一定的参考价值。
参考技术A oracle数据库中是有int型的,你在创建表的时候,使用int型报错,可能的原因是你为int型增加了精度,如int(10),或者是你的oracle
版本过低造成的。
在oracle中int型与integer型都是number类型的子类型,int是integer
的简写,相当于number(38),是为了兼容ANSI/ISO和IBM的数据类型
而定义的。它的存储精度是38位。
在创表时,最好不要用int型,因为我们基本上不会用到38位的整数,
用int会浪费存储空间。int型列可以定义为number(数字)。 参考技术B INT类型是NUMBER类型的子类型。
下面简要说明:
(1)NUMBER(P,S)
该数据类型用于定义数字类型的数据,其中P表示数字的总位数(最大字节个数),而S则表示小数点后面的位数。假设定义SAL列为NUMBER(6,2)则整数最大位数为4位(6-2=4),而小数最大位数为2位。
(2)INT类型
当定义整数类型时,可以直接使用NUMBER的子类型INT,顾名思义:INT用于整型数据。
所以你这个sla int not null就行了,不用指定大小追问
改为char类型就好了,为什么int就不行
追答int是可以的,你别用int(20),就写int就行了
参考技术C 建议直接用number就可以,int不能指定长度。int只能存取整数,等同于number(38,0) 参考技术D oracle本来就没有int类型,为了与别的数据库兼容,新增了int类型作为number类型的子集。
int类型只能存储整数;
number可以存储浮点数,也可以存储整数;
number(8,1)存储小数位为1位,总长度为8的浮点数,如果小数位数不足,则用0补全;
number(8)存储总长度为8的整数;
int相当于number(22),存储总长度为22的整数。
所以如果使用INT,不要指定长度。要指定长度,请使用NUMBER(P,S)
另外,NUMBER 如果precision和scale没有指定,即相当于 NUMBER (38,7)。 第5个回答 2014-05-05 都是number类型的吧,你的int型,还可以为20个字节- -
DDL数据语言|库表管理(MySQL)
目录
库的管理
∙ \\bullet ∙ 创 建 库 c r e a t e \\colorRed创建库create 创建库create
语法
:
c
r
e
a
t
e
d
a
t
a
b
a
s
e
[
i
f
n
o
t
e
x
i
s
t
s
]
库
名
;
\\colorVioletcreate \\ database \\ [if \\ not \\ exists] \\ 库名;
create database [if not exists] 库名;
其中加上 if not exists 可以有效的避免报错,提高容错性。
∙ \\bullet ∙ 修 改 库 a l t e r \\colorRed修改库alter 修改库alter
主要就是更改库的字符集操作
语法
:
a
l
t
e
r
d
a
t
a
b
a
s
e
库
名
c
h
a
r
c
t
e
r
s
e
t
字
符
集
;
\\colorVioletalter \\ database \\ 库名 \\ charcter \\ set \\ 字符集;
alter database 库名 charcter set 字符集;
∙ \\bullet ∙ 删 除 库 d r o p \\colorRed删除库drop 删除库drop
语法
:
d
r
o
p
d
a
t
a
b
a
s
e
[
i
f
e
x
i
s
t
s
]
库
名
;
\\colorVioletdrop \\ database \\ [if \\ exists ] \\ 库名;
drop database [if exists] 库名;
其中加上 if exists 可以有效的避免报错,提高容错性。
表的管理
∙ \\bullet ∙ 创 建 表 c r e a t e \\colorRed创建表create 创建表create
语法
:
c
r
e
a
t
e
t
a
b
l
e
表
名
(
字
段
名
类
型
[
(
长
度
)
约
束
]
,
.
.
.
)
;
\\colorVioletcreate \\ table \\ 表名(字段名 类型[(长度) 约束],...);
create table 表名(字段名类型[(长度)约束],...);
其中文章最后介绍了相关的类型以及约束。表的创建样例如下:
∙ \\bullet ∙ 修 改 表 a l t e r t \\colorRed修改表altert 修改表altert
核心语法
:
a
l
t
e
r
t
a
b
l
e
表
名
a
d
d
∣
m
o
d
i
f
y
∣
c
h
a
n
g
e
∣
d
r
o
p
c
o
l
u
m
n
列
名
[
列
类
型
约
束
]
;
\\colorVioletalter \\ table \\ 表名 \\ add|modify|change|drop \\ column \\ 列名[列类型 \\ 约束];
alter table 表名 add∣modify∣change∣drop column 列名[列类型 约束];
修改列名:alter table 表名 change column 旧列名 新列名 类型;
修改列的类型或约束:alter table 表名 modify column 列名 新类型;
添加新列:alter table 列名 add column 列名 类型;
删除列:alter table 列名 drop column 列名;
修改表名:alter table 旧表名 rename to 新表名;
示例:增加一列age年龄,并将id列名改为stuID。
∙ \\bullet ∙ 删 除 表 d r o p \\colorRed删除表drop 删除表drop
语法
:
d
r
o
p
t
a
b
l
e
[
i
f
e
x
i
s
t
s
]
表
名
;
\\colorVioletdrop \\ table \\ [if \\ exists] \\ 表名;
drop table [if exists] 表名;
∙ \\bullet ∙ 复 制 表 \\colorRed复制表 复制表
仅仅复制表的结构
语法
:
c
r
e
a
t
e
t
a
b
l
e
复
制
表
l
i
k
e
原
始
表
;
\\colorVioletcreate \\ table \\ 复制表 \\ like \\ 原始表;
create table 复制表 like 原始表;
复制表的结构+数据
语法
:
c
r
e
a
t
e
t
a
b
l
e
复
制
表
s
e
l
e
c
t
∗
f
r
o
m
旧
表
名
;
\\colorVioletcreate \\ table \\ 复制表 \\ select \\ * \\ from \\ 旧表名;
create table 复制表 select ∗ from 旧表名;
字段类型
我们选择类型的原则
为:所选择的类型越简单越好,能保存数值的类型越小越好。
整型
分类
:tinyint、smallint、mediumint、int/integer、bigint(分别占1,2,3,4,8字节)
注意事项
:
∙
\\bullet
∙ 我们一般使用 INT,它默认为有符号整型。当需要使用无符号整型时,在INT 后追加 UNSIGNED
关键字。
∙
\\bullet
∙ 超出范围后,报out of range
异常。
∙
\\bullet
∙ 如果不设置长度,会有默认长度,长度代表了显示的最大宽度,使用zerofill
关键字可以显示前面补充的0(但是只能对正数使用改关键字)。
示例:
小数型
小数型数据具体还可以再分为浮点型和定点型。
其中浮点型数据类型有float(M,D)
(4个字节)、double(M,D)
(8个字节)。M表示整数位数+小数位数,D表示小数位数,但是我们一般不去设置参数,我们直接让它自己进行判断。
其中定点型数据类型为decimal(M,D)
,它的范围与double相同,但是更精确。当我们不给它参数时,它会有默认值为(10,0)
示例:
字符型
字符型类型我们主要使用的是char(M)
与varchar(M)
,M表示最多的字符数。它们的比较如下:
类型 | 含义 | 是否节省空间 | 是否可以省略M | 性能 |
---|---|---|---|---|
char(M) | 固定长度字符,每次申请空间都为M个字符 | 否 | 可以,默认为1 | 相对较高 |
varchar(M) | 可变长度字符,按照情况动态申请空间 | 是 | 不可以 | 相对较低 |
其余还有一些字符型类型比如说:
binary
、varbinary
保存较短的二进制字符串
enum
用于保存枚举,只能选一个插入
set
用于保存集合,一次可以插入多个
日期型
日期型的类型主要有以下几个:
类型 | 字节 | 含义 |
---|---|---|
data | 4 | 表示日期 |
time | 3 | 表示时间 |
year | 1 | 表示年份 |
datatime | 8 | 表示时间+日期 |
timestamp | 4 | 表示时间+日期 |
注意
:timestamp 比datatime更加精确,它会显示当前时区的时间(随时区的变化而变化)。
约束类型
约束含义
:一种限制,用于限制表中的数据,为了保证表中的数据准确可靠性。
分类
约束的分类
:
NOT NULL
非空约束,保证该字段的值非空,比如:姓名、学号等;
DEFAULT
默认约束,保证该字段有默认值,比如:性别
PRIMARY KEY
主键约束,用于保证该字段的值具有唯一性并且非空,比如学号
UNIQUE
唯一 约束,用于保证该字段的值具有唯一性,可以为空,比如座位号,但是只能有一个空,否则就算重复了
CHECK
检查约束,mysql不支持,用来检查有无不符合的值
FOREIGN KEY
外键约束,用于限制两个表的关系,用于保证该字段的值必须来自主表关联列的值。在从表添加外键约束用于引用主表中某列的值。比如学生表的专业编号。
添加约束的时机
:设计表时、修改表时(在数据添加之前)
约束的添加分类
:
∙ \\bullet ∙ 列极约束:直接在字段名和类型后面追加约束类型,六大约束语法上都支持,但是外键约束没有效果
∙ \\bullet ∙ 表极约束:在各个字段的最后添加除了非空、默认,其他的都支持,一般表极约束只添加外键约束。
创建表时添加约束
使用列极约束:
使用表极约束:在各个字段的最后添加 [CONSTRAINT] 约束名 约束类型(字段名)
注意
:show index from … 查看表中的所有索引,包括主键、外键、唯一
修改表时添加约束
1.添加列级约束modify column,在列名后面接列类型、约束
2.添加表级约束 add,在列名后面接列类型、约束
修改表时删除约束
语法
:
a
l
t
e
r
t
a
b
l
e
表
名
d
r
o
p
约
束
约
束
名
\\colorVioletalter \\ table \\ 表名 \\ drop \\ 约束 \\ 约束名
alter table 表名 drop 约束 约束名
注意
主键约束和唯一约束的对比
:
类型 | 唯一性 | 是否允许为空 | 一个表中可以有几个 | 是否允许组合 |
---|---|---|---|---|
主键 | 保证 | 不允许 | 只能有一个 | 允许(不推荐) |
唯一 | 保证 | 允许 | 可以有多个 | 允许(不推荐) |
外键特点
:
1.在从表上设置外键关系
2.从表的外键列的类型与主表的外键列类型一致或兼容,名称无要求
3.主表的关联列必须是一个key(一般是主键或唯一键)
4.插入数据时,先插入主表后插入从表;删除数据时,先删除从表,后删除主表
以上是关于oracle数据库创建表时,int型数据为何报错的主要内容,如果未能解决你的问题,请参考以下文章
oracle我建表时的数据类型是int,为啥插值的时候小数照样能插不报错?
oracle 中建表时,属性用int好还是number好 ?