Oracle表的创建与管理
表是Oracle数据库中最基础的存储对象,用于存储数据。本文主要介绍了Oracle表的创建与管理,包括表的创建、修改、删除、重命名,表的索引、约束以及表中数据的增、删、改、查等基本操作。
在Oracle数据库中,创建表需要使用CREATE TABLE语句:
CREATE TABLE table_name
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
columnN datatype [ NULL | NOT NULL ]
);
其中,table_name是要创建的表的名称,column1 ~ columnN是表中的列名,datatype是数据类型,NULL和NOT NULL表示该列是否允许为空。
如创建一个名为student的表,包含学生的姓名、性别、年龄和学号四个字段,使用以下语句:
CREATE TABLE student
(
name VARCHAR2(50) NOT NULL,
gender CHAR(1) NOT NULL,
age NUMBER(3),
num VARCHAR2(20) PRIMARY KEY
);
上述语句创建了一个名为student的表,包含四个字段:name(姓名)、gender(性别)、age(年龄)和num(学号)。其中,name和gender字段不允许为空,age字段允许为空,num字段为主键,用于唯一标识每个学生。
创建表的其他参数:
PCTFREE 保留空间PCTUSED 从表中删除数据,使得数据块空间不断减少,减少至40%时,可再次插入数据(PCTFREE与PCTUSED之和越接近100%,数据块空间利用率越高)。INITRANS 初始事务数量MAXTRANS 最大的事务并发数量CACHE 指定将表中的数据放在数据库高速缓存中,默认NOCACHE。对于较小、访问频繁的表,使用CACHE,在用户第一次访问表中数据时,整个表被加载到数据库高速缓存。LOGGING 默认情况下,用户在表上执行DDL和DML都会产生重做日志。如果不希望产生重做日志,使用NOLOGGING子句。COMPRESS 使用该子句,一个数据块中两行完全相同的数据将被压缩为一行。创建表的时候插入数据
create table tt as select id,name from table1;
create table t1 parallel 8 nologging compress as select * from table1;
创建临时表
create global temporary table t1(name varchar(10)) on commit delete rows;
临时表为会话级,表中数据一致保留直到当前会话结束。
create global temporary table t1(name varchar(10)) on commit preserve rows;
实际开发中可能需要对已有的表进行修改,如添加新的列、删除已有的列、修改列的数据类型等。Oracle提供了ALTER TABLE语句来实现这些操作:
ADD用于添加新的列ALTER TABLE table_name
ADD (column_name datatype [ NULL | NOT NULL ],
column_name datatype [ NULL | NOT NULL ],
...);
DROP COLUMN用于删除已有的列ALTER TABLE table_name DROP COLUMN column_name;
MODIFY用于修改列的数据类型ALTER TABLE table_name
MODIFY (column_name datatype [ NULL | NOT NULL ]);
如对于之前创建的student表,添加一个新的字段address:
ALTER TABLE student
ADD (address VARCHAR2(100) NULL);
上述语句在student表中添加了一个新的字段address,数据类型为VARCHAR2,长度为100,允许为空。
(1)插入数据
使用INSERT语句向表中插入数据:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
其中,table_name是要插入数据的表的名称,column1、column2、column3等是表中的列名,value1、value2、value3等是要插入的数据值。
例如向student表中插入一条数据,可以使用以下语句:
INSERT INTO student (name,gender, age,num)
VALUES ( 'John','M',20,01);
该语句将向student表中插入一条数据,包含name为’John’、gender为’M’、age为20、num为01的记录。
向目标表插入源表数据
插入数据时,如果源表和目标表字段名、字段数量、字段顺序都相同:
insert into table1 select * from table2;
否则 使用:
insert into table1(col1, col2, ..., coln) select col1, col2, ..., coln from table2;
(2)删除数据
使用DELETE语句从表中删除数据:
DELETE FROM table_name WHERE condition;
其中,table_name是要删除数据的表的名称,condition是删除记录的条件。
例如从student表中删除age大于等于25的记录,可以使用以下语句:
DELETE FROM student WHERE age >= 25;
(3)更新数据
使用UPDATE语句更新表中的数据:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
其中,table_name是要更新数据的表的名称,column1、column2等是要更新的列名,value1、value2等是要更新的数据值,condition是更新记录的条件。
例如将student表中id为1的记录的age更新为21,可以使用以下语句:
UPDATE student
SET age = 21
WHERE id = 1;
(4)查询数据
使用SELECT语句从表中检索数据,例如查询student表中i所有年龄大于26岁的学生信息:
SELECT * FROM student WHERE age > 20;
Merge用于需要使用SQL语句同时进行Insert/Update的操作,也就是说当存在记录时就更新(Update),不存在数据时就插入(Insert)。
执行Merge前:

执行以下语句:
Merge Into products t
Using newproducts s
On (t.product_id=s.product_id)
When Matched Then
Update Set t.product_name=s.product_name,t.Category=s.Category
When Not Matched Then
Insert Values(s.product_id,s.product_name,s.Category)

其中,insert和update是可选的,UPDATE 和INSERT后面可以跟WHERE子句,UPDATE子句后面可以跟delete来去除一些不需要的行。在ON条件中可以使用常量来insert所有的行到目标表中,不需要连接到源表和目标表。
truncate table table_name;
DROP TABLE table_name;
例如删除之前创建的student表:
DROP TABLE student;
上述语句将删除名为student的表及其所有数据。在执行DROP TABLE语句前,应确保该表不再被其他对象所使用,否则会抛出错误。
purge彻底删除表使用RENAME语句修改表名:
RENAME table_name TO new_table_name;
例如将之前创建的student表重命名为new_student:
RENAME student TO new_student;
数据库索引的作用是减少读数据所需的磁盘访问次数,加快数据访问速度,提高数据库性能。
索引提供指向存储在表的指定列中的数据值的指针,可快速定位需要的数据,从而提高查询效率。如果没有索引,查询需要扫描整个表,将花费大量时间和资源。
Oracle索引由一系列存储在磁盘上的索引项组成,索引项第一列是索引键(keyval),第二列是行指针(ROWID)。
ROWID由数据库自动生成,包含18个字符串:
OOOOOO/FFF/BBBBBB/RRR对应数据库对象编号/数据文件编号/数据块号/行号。
Oracle数据库中有多种类型的索引,包括B树索引、位图索引、函数索引、全文索引等。
(1)B树索引
Oracle默认为B树,是Oracle数据库中最常用的索引类型。它是一种平衡树结构,可以快速定位需要的数据。B树索引通常由一个或多个列组成,这些列存储了数据库表中的数据。当查询需要访问这些数据时,B树索引可以帮助快速定位它们。
B树索引的优点是查询速度快,适用于大多数查询场景。但B树索引维护成本高,当表中的数据发生变化时,需要更新索引,这将影响数据库的性能。
(2)位图索引
位图索引是一种用于处理大量重复数据的索引类型。它将每个索引值映射到一个位图,每个位图表示一个索引值是否存在。当查询需要访问这些数据时,位图索引可以帮助快速定位它们。
位图索引的优点是适用于处理大量重复数据的查询场景,可以显著提高查询效率。但是,位图索引不适用于处理不重复的数据,且索引维护成本高。
(3)函数索引
函数索引是一种用于处理函数表达式的索引类型。它将函数表达式的计算结果存储在索引中,当查询需要访问这些数据时,函数索引可以帮助快速定位它们。
函数索引的优点是适用于处理函数表达式的查询场景,可以显著提高查询效率。但是,函数索引的缺点是索引维护成本高,且只适用于特定的函数表达式。
(4)全文索引
全文索引是一种用于处理文本数据的索引类型。它将文本数据分解为单词,并将每个单词映射到一个索引值。当查询需要访问这些数据时,全文索引可以帮助快速定位它们。
全文索引的优点是适用于处理文本数据的查询场景,可以显著提高查询效率。但是,全文索引的缺点是索引维护成本高,且需要特定的全文搜索引擎。
在Oracle中可以为表中的列创建索引。例如,在student表的num列上创建一个名为“idx_num”的索引:
CREATE INDEX idx_num ON student(num);
数据库中,约束是用来保证数据的完整性和一致性的规则。Oracle数据库通过使用约束来限制表中数据的输入和更改,使得数据库中存储的数据是结构正确的,并且可以被其他程序和用户正确地共享和查询。
(1)主键约束
主键约束是用来唯一标识表中每个记录的一种方式,即主键必须在表中具有唯一性,不能为NULL,且只能定义一个主键约束。主键通常用来建立关系型数据库之间的连接。
建立主键约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name PRIMARY KEY (column1, column2);
如对于student表,建立主键约束:
Alter Table student Add Constraint pk_num Primary Key (num);
(2)外键约束
外键约束用于在表之间建立一对多或多对多的关系,它指明了一个表中的某个字段必须引用另一个表中的主键约束。外键值必须在引用表中存在或者为空值。
创建外键约束:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name FOREIGN KEY (column1) REFERENCES other_table(column2);
(3)唯一约束
唯一约束用于确保某个字段或一组字段中的值是唯一的。与主键不同,唯一约束允许 null 值。
创建唯一约束:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2);
(4)CHECK约束
创建CHECK约束:
Alter Table nn Add Constraint ck_emp_n2 Check(n2='男' Or n2='女')
dual是一个虚拟表,用来构成select的语法规则。
查看表结构:
desc dual;

oracle保证dual里面永远只有一条记录,查询表数据:
select * from dual;

Dual属于SYS schema,以PUBLIC SYNONYM的方式供其他数据库USER使用
SQL> select owner, object_name , object_type from dba_objects where object_name like '%DUAL%'; OWNER OBJECT_NAME OBJECT_TYPE

常见用途如下:
select user from dual; #查看当前用户
select SYS_CONTEXT('USERENV','TERMINAL') from dual; #调用系统函数
SQL> select your_sequence.nextval from dual; #得到序列下一个值
SQL> select your_sequence.currval from dual; #得到序列当前值
SQL> select 7*9 from dual; #计算器
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el