什么是主键,什么是外键,有什么关系?
INSERT (字段列表)问题一:什么是主键和外键 通俗的说吧
oracle主键 oracle主键约束
oracle主键 oracle主键约束
先说说主键(primary key)吧:一张表(关系)的一个列(属性)或多个列可以作为主键,但是前提是让这个列作主键,这个列就能保证该列下的各个行(元组)的值不能相同,比如说你用姓名属性作主键的话,那么这个主键就不一定可以,如果有两个人是同样的名字的话,就不能做到该属性下的各个元组数据的值不同,如果用 数字作主键就是一个很好的选择。
再说说外键(foreign key):一张表(关系)的列(属性)它同时存在表1和表2中,它不是表1的主键,而是表2的主键,就可以说他是表1的外键。
问题二:SQL中什么叫主键,什么是外键,有啥关系 就好像一个订单需要2张表
1站订单表 一张订单明细表 订单表里(id面的ID是主键
订单表的一个产品如果删掉了 但明细表里面的关联订单表的数据没删掉 就造成了数据冗余
所以设置主外键是防止数据误删和冗余 设置主键后 如果明细表的数据没删掉 主键内的信息就删不掉
问题三:什么是主键和外键 这需要理清几个概念:
1)候选键: 关系中的一个属性组,其值能标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选码。
2)主键:当有多个候选码时,可以选定一个作为主码,选定的候选码称主键
3)外键: 关系R中的一个属性组,它不是R的候选码,但它与另一个关系S的候选码相对应,则称这个属性组为R的外码或外键。
问题四:什么是主键和外键 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能标识一条记录,该属性组就可以成为一个主键比如 :
学生表(学号,姓名,性别,班级)
其中每个学生的学号是的,学号就是一个主键
用户表(用户名、密码、登录级别)
其中用户名是的, 用户名就是一个主键
上机记录表(,学号,姓名、序列号)
上机记录表中单一一个属性无法标识一条记录,学号和姓名的组合才可以标识一条记录,所以 学号和姓名的属性组是一个主键
问题五:什么是外键表,什么是主键表? 表1是主键表、
表1的主键字段在表2中做外键、而表1自己却没有外键
表2是外键表
有一个依赖表1typeid的字段、作为外键、取值必须是其依赖主键表表1中主键字段有的值
问题六:数据库中什么是主键,什么是外键 主键(Primary key): 也称为主码或主关键字,用于惟一地确定一个元组的属性或属性组(复合主码)。每个关系都有一个并且只有一个主码。
外键(Foreign Key):也称为外码或外部关键字。如果一个属性集不是所在关系的关键字,但是是其他关系的关键字,则该属性集称为外部关键字。在关系数据库中可以通过外键使两个关系关联,这种联系通常是一对多(1:n)的,其中主(父)关系(1方)称为被参照关系,从(子)关系(n方)称为参照关系。
问题七:oracle中 主键和外键是什么意思?什么地方采用呢? 1、这种简单的搜一下都有吧。不止oracle,所有关系型数据库主键和外键的含义都一致;
2、主键和外键是两种类型的约束;
3、主键是能的标识表中的每一行,就是说这一列非空且值不重复,可以指定为主键;作用是用来强制约束表中的每一行数据的性;
4、外键是b表中的某一列引用的值来源于a表中的主键列。也是约束b表中的外键列的值必须取致a表中的主键列值,不是其中的值就不能插入b表中。可以形成a表b表的联系,保持数据的约束和关联性。
问题八:sql中什么叫主键表,什么叫外键表 主键表 外键表 这个概念没有 没听过
不过从字面理解 这个应该是基于有外键的表说的
有外键的那张表是外键表 另外张关联外键的应该就是主键表
怎么给oracle里的表主键设置成uuid
(1)ID自增可以使用sequence实现,创建sequence的语句如下:如果还没有创建表,那么使用下面的方式创建就可以了。
create table testuu(
id varchar2(2000) default sys_guid(),
name varchar2(2000)) ;
如果已经创建了表,那么先保证你原有的主键ID没有任何实际的业务意义start with 1 /开始值/,要修改的话使用下面的方法。
alter table testuu modify id default sys_guid() ;
update testuu set id = sys_guid ();
oracle中如何设置主键并且让其自动增长
maxextents unlimited由于oracle中是没有自动增长的的,需要自己去进行写触发器等方式去进行设置:
找了一下他人写的,有两种方法可以设置主键,一种是自增长主键,另一种就是生成序列。
一、自增长主键
-- Create tablecreate table USERINFO( USERNO NUMBER not null, USERNAME NVARCHAR2(20), USERPWD NVARCHAR2(20))tablespace MYPRODUCT pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );-- Create/Recreate primary, unique and foreign key constraints alter table USERINFO add constraint USERNO primary key (USERNO) using indextablespace MYPRODUCT pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );
其实上面你也可以用plSql进行图界面设置,我就是这样做的,为了学习,将其生成的sql代码进行后贴在这里。
主要是为了以后的学习,和供他人的参考。 下面是我的进行设置MON ASC,触发器的sql语句:
create sequence SEQ_Userinf start with 1 increment by 1nomaxvaluenominvaluenocache;
CREATE OR REPLACE TRIGGER tg_testBEFORE INSERT ON User FOR EACH ROW WHEN (new.userNo is null)beginselect SEQ_Userinf.nextval into:new.userNO from dual;end; 进行插入语句:insert into user(userName,userpwd) values(‘d‘,‘d‘);
我表里是有一个数据,次插入的时候回出来错误的对话框,第二次就可以了 对上面进解释:
- 再建一个序列SEQ_Userinfcreate sequenceSEQ_Userinfminvalue 1 --最小值nomaxvalue --不设置值start with 1 --从1开始计数increment by 1 --每次加1个nocycle --一直累加,不循环nocache; --不建缓冲区 执行完后可以看一下结构:
第二种、序列
序列生成器所生成的数字只能保证在单个实例里是的,这就不适合将它用作并行或者远程环境里的主关键字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。SYS_GUID会保证它创建的标识符在每个数据库里都是的。此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则它就不能保证其值是的)。SYS_GUID源自不需要对数据库进行访问的时间戳和机器标识符,这就节省了查询的消耗。
很多应用程序都依靠序列生成器来创建数据行的主关键字,这些数据行没有一个明显的主值,这也就是说,在这样的数据集里一条记录的创建就会让数据列发生改变。因此,可能会对在表格中将SYS_GUID用作主关键字而不使用序列数感兴趣。这在对象在不同机器的不同数据库里生成以及需要在后来合并到一起的情况下很有用。
使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上的消耗;问题就是在哪里。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。对序列而言,性能上的影响在查询期间,在这个时候,SGA序列的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被丢失。
SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为Web参数来传递。出于这些原因,将SYS_GUID作为一个主关键字不是一个很好主意,除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。 oracle中如何设置主键并且让其自动增长
标签:
oracle主键删除了但是user_index表还有
那么什么是候选键(Candidate Key)呢:能标识表(关系)中行(元组)的列(属性),则称该属性为候选键,也称 候选关键字 或 候选码;由此来看候选键可以不只一个,还看一看得出的就是主键同时它也是候选键在Oracle数据库中,我们知道创建主键约束的时候,会自动创建索引,靠着索引,保证数据的,删除主键约束时,会自动删除对应的索引。但是最近碰到了个奇怪的问题,同事说测试环境中删除一张表的主键约束,发现约束删了,但索引还在,难道有什么隐藏的问题
Oracle11.2.0.4,创建测试表,然后创建主键,自动生成同名的索引,
但是现象在这摆着的,有果必有因,看下MOS,是不是有类似的案例出现过,果然,370633.1这篇文章介绍的和我们碰到的很像,使用ALTER TABLE删除主键约束的时候不能删除隐含的索引,但是请注意,有个前提,就是待删除主键约束的表是通过导入执行的,并不是我们自己手工创建的,而且文章 明确说了如果表是自行创建的,不是导入进来的,删除主键约束的时候会连CREDIT NUMBER(2),带删除主键索引,这个问题来自于一个未公布的bug,3894962,通过导入 作,主键索引并未依赖于主键约束,因此当删除主键约束的时候,不会自动删除对应的主键(/)索引,值得一提的是,9i中并无此现象,从10.1.0之 后的版本才出现此问题,解决方案就是删除索引,一种方式是drop constraint的时候带上drop index,一次性执行,另一种就是drop index删除索引
oracle怎么实现id自增和设置主键
using index tablespace index_statcreconstraintsate sequence SEQ_ID /Sequence名称为SEQ_ID/
minvalue 1 /最小值/
maxvalue 99999999 /值/
increment by 1 /每次增加的值/
cache 20; /缓存个数/插入时使用SEQ_ID.NEXTVAL取下一个值。
alter table B
在oracle中,创建表时,不创建主键,有没有默认索引?如果有,是什么索引?
constraintOracle数据库创建表是有两个约束带有默认索引。
1、主键primary Key:索引、非空2、Unique:索引,可以是空值
如果没有设定主键和约束,表中不会有默认索引的。
怎样给oracle视图加一个主键
oracle是可以为视图加主键,写法: create or replace view mylist(myid,insize,outsize,statrtime,endtime,jobid,iadd constraint PK_B primary key (ID);注:建议使用PLSQLDloper工具,上述作都可以实现可视化,很方便。meiid,ip,useragent UNIQUE RELY DISABLE NOVALIDATE,CONSTRAINT id_pk PRIMARY KEY (myid) RELY DISABLE NOVALIDATE)
select job.dm_session_id as myid,
.dm_request_size as insize,
.dm_response_size as outsize,
job.end_time_stamp as endtime,
job.job_id atables jobid,
job.dev_external_id as imeiid,
.client_ip as ip,
.user_agent as useragent
from V_DM_TRACKING_LOG__SUM job,DM_TRACKING_LOG_HTTP where job.Dm_Session_Id=.dm_session_id
oracle 海量数据表是否有必要设主键
和普通表添加主键没什么区别,直接给表T添加主键即可。海量数据表?是海量数据吧。其实意思不多。就是可以理解为数据仓库的。其实没有必要创建主键,因为这些表的字段应该可能会发生改变,并且海量的数据,索引所占的空间以及维护也pctfree 10是一个问题。oracle 索引的原则是什么,这个很多
oracle在建表时如何指定主键的索引名和主键的表空间
minextents 1设你的表空间index_stat 用户名称为scott
我创建一个用户的信息表create table scott.tmp(
MON VARCHAR2(6) ,
IDNO VARCHAR2(10) ,
primary key ( MON, IDNO )
) ;
自动生成的那个索引好像是不能改的,不过你可以给主键指定新的索引,语法如下:
alter table 表名 add constraints 索引名 primary key using index ...
create unique index tmp_PK on scott.tmp (
IDNO ASC
MON VARCHAR2(6) ,
IDNO VARCHAR2(10)
alter table tmp
add constraint PK_tmp primary key ( MON, IDNO )
using index
tablespace index_stat
initrans 2
maxtrans 255
storage
(initial 64K
两个都一样:
MON VARCHAR2(6) ,
IDNO VARCHAR2(10) ,
constraint pk_tmp primary key ( MON, IDNO )
) ;
如何在oracle中查询所有用户表的表名、主键名称、索引、外键等
或者直接使用create语句,例子如下:查询出所有的用户表。
查所有用户的表在all_tables
主键名称、外键在all_constraints
索引在all_indexes
但主键也会成为索引,所以主键也会在all_indexes里面。
具体需要的字段可以DESC下这几个view,dba登陆的话可以把all换成dba。
查询用户表的索引(非聚集索引):
select from user_indexes
where uniqueness = 'NONUNIQUE '
查询用户表的主键(聚集索引):
select from user_indexes
);where uniqueness = 'UNIQUE '
1、查找表的所有索引(包括索引名,类型,构成列):
select t.,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表
2、查找表的主键(包括名称,构成列):
select cu. from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' and au.table_name = 要查询的表
3、查找表的性约束(包括名称,构成列):
select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'U' and au.table_name = 要查询的表
4、查找表的外键(包括名称,引用表的表名和对应的键名,下面是分成多步查询):
select from user_constraints c where c.constraint_type = 'R' and c.table_name = 要查询的表
查询外键约束的列名:
select from user_cons_columns cl where cl.constraint_name = 外键名称
查询引用表的键的列名:
select from all_tables;
oracle 如果存在主键则更新(update),否则添加新纪录(insert)怎么写。
SYS_GUID() 生成32位的编码。这个容易,用merge就行了,具体用法大致如下、
merge into 目标表
using(select ……) -----这里是要更新或要插入的数据,一般用select来构造
USING (SELECT t_record.deptno, t_record.dname, t_record.locon ……------这里是更新判断时的关联条件
when match then update 表名 set 字段名=…… -----如果能匹配(即有数据)则更新
WHEN NOT MATCHED THEN
values(值列表)
大致如此,具体更详细的用法你可以进一步百度MERGE的用法,资料很多的,这里不赘述了
MERGE INTO table_name alias1 --需要做更新或新增记录的表
USING (table|view|sub_query) alias2 -- 对照表
ON (join condition) --关联条件
WHEN MATCHED THEN -- 当匹配上则更新
SET col1 = col_val1,
col2 = col_val2
WHEN NOT MATCHED THEN -- 无匹配记录则 新增数据
INSERT (column_list) VALUES (column_values);
可以用merge语句。给你举个例子
CREATE OR REPLACE PROCEDURE test (in_deptno IN NUMBER,
in_dname IN VARCHAR2,
in_loc IN VARCHAR2)
AS
t_record scott.dept%ROWTYPE;
BEGIN
SELECT in_deptno, in_dname, in_loc INTO t_record FROM DUAL;
---用merge语句
MERGE INTO scott.dept dept
FROM DUAL)
WHEN MATCHED
THEN
UPDATE SET dept.dname = t_record.dname, dept.loc = t_record.loc
WHEN NOT MATCHED
THEN
INSERT (deptno, dname, loc)
VALUES (t_record.deptno, t_record.dname, t_record.loc);
END;
你这个说的太含糊了,这个要看表结构 有没设置主键,你应该是要根据主键的值来判断update 还是insert吗?
跟原来一样的,不过别一起作