精华内容
下载资源
问答
  • 创建主键
    千次阅读
    2021-11-26 11:11:05

    1 背景

        创建表的时候没有设置主键,希望可以通过SQL语句追加主键

    2 语句

        

    alter table 表名 add constraint 索引名称 primary key (成为主键的列)

    更多相关内容
  • MySQL里Create Index 能否创建主键 Primary Key? 答案: 不能,必须用 Alter table 创建。 MySQL一个索引列最大允许的有效长度,不是列的所有数据都被索引的MyISAM 是 1000字节 InnoDB 是 767 字节 注意这里是字节。...
  • 主键自增在插入数据的时候是很实用的,可以获取并操作返回的插入记录的ID,接下来介绍Oracle如何创建主键自增表,感兴趣的你可以了解下,就当是巩固知识,希望此文对你有所帮助
  • 到此这篇关于Navicat Premium中Oracle创建主键自增的方法的文章就介绍到这了,更多相关Navicat Premium主键自增内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!
  • 1.创建主键语法 ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名); 2.创建外键语法 ALTER TABLE news_info[子表名] ADD CONSTRAINT FK_news_info_news_type[约束名] FOREIGN KEY (info_id)[子表列]...
  • Oracle创建主键的三种方式

    万次阅读 2021-03-05 10:11:58
    Oracle中创建主键,可以有几种方式。第一种,在建表的时候同时指定主键,SQL> create table t_pk_01 (id number, constraint pk_id...

    Oracle中创建主键,可以有几种方式。

    第一种,在建表的时候同时指定主键,

    SQL> create table t_pk_01 (id number, constraint pk_id_01 primary key(id));
    Table created.
    

    创建主键约束的同时,他会自动创建一个唯一索引,

    SQL> select table_name, constraint_name, constraint_type from user_constraints where table_name='T_PK_01';
    TABLE_NAME                     CONSTRAINT_NAME                C
    ------------------------------ ------------------------------ -
    T_PK_01                        PK_ID_01                       P
    
    
    SQL> select table_name, index_name, uniqueness from user_indexes where table_name='T_PK_01';
    TABLE_NAME                     INDEX_NAME                     UNIQUENES
    ------------------------------ ------------------------------ ---------
    T_PK_01                        PK_ID_01                       UNIQUE
    

    第二种,创建表,再alter table增加主键约束,

    SQL> create table t_pk_02 (id number);
    Table created.
    
    
    SQL> alter table t_pk_02 add constraint pk_id_02 primary key (id);
    Table altered.
    

    我们从10046来看下alter table到底做了什么,

    SQL> alter session set events '10046 trace name context forever, level 12';
    Session altered.
    
    
    SQL> alter session set tracefile_identifier='bisal';
    Session altered.
    
    
    SQL> alter table t_pk_02 add constraint pk_id_02 primary key (id);
    Table altered.
    
    
    SQL> alter session set events '10046 trace name context off';
    Session altered.
    
    
    SQL> select distinct(m.sid),p.pid,p.tracefile from v$mystat m,v$session s,v$process p where m.sid=s.sid and s.paddr=p.addr;
           SID        PID   TRACEFILE
    ---------- ----------- -------------------------------------------------------------------------------
           189         22   /u01/app/oracle/diag/rdbms/dcm/DCM/trace/DCM_ora_18653_bisal.trc
    

    从trace我们能看到,对T_PK_02加了share模式锁,指定nowait,先创建的约束,然后创建了唯一索引,

    ...
    LOCK TABLE "T_PK_02" IN SHARE MODE  NOWAIT
    ...
    alter table t_pk_02 add c
    ...
    update con$ ...
    ...
    insert into con$ ...
    ...
    CREATE UNIQUE INDEX "BISAL"."PK_ID_02" on "BISAL"."T_PK_02"("ID") NOPARALLEL
    

    第三种,分开创建主键约束和主键索引。

    主要有两个场景。

    (1) 当使用CTAS创建表时,

    SQL> create table t_pk_03 as select * from t_pk_01;
    Table created.
    

    主键约束并未带过来,

    SQL> select table_name, constraint_name, constraint_type from user_constraints where table_name='T_PK_03';
    no rows selected
    
    
    SQL> select table_name, index_name, uniqueness from user_indexes where table_name='T_PK_03';
    no rows selected
    

    此时如果表中存在很多的数据,直接使用方法2,可能会带来两个问题,

    1. 创建唯一索引的用时。

    2. 唯一索引允许包含空值,因为主键约束不允许空值,还需要判断字段是否为空的用时。

    对(1),从trace,我们可以看到,默认创建唯一索引的时候,并未指定online,因此用时取决于数据量。

    对(2),如果字段设置NOT NULL,应该不需要判断,如果没设置,则需要判断字段中是否含空值,还是取决于表的数据量。

    因此,可以选择先在线创建唯一索引,再增加主键约束,从trace能看到,此时增加主键约束的过程中,不会再操作索引,

    SQL> create unique index pk_id_03 on t_pk_03(id) online;
    Index created.
    
    
    SQL> alter table t_pk_03 add constraint pk_id_03 primary key (id);
    Table altered.
    

    (2) 往往在生产环境,数据表空间和索引表空间是分开的,如果采用第一种和第二种的方式,主键索引会创建在执行用户的默认表空间,很可能是数据表空间,因此分开创建,还可以在创建索引的时候,指定tablespace,明确索引表空间,

    SQL> create unique index pk_id_03 on t_pk_03(id) tablespace xxx;
    Index created.
    

    近期更新的文章:

    小白学习MySQL - 数据库软件和初始化安装

    小白学习MySQL - 闲聊聊

    Redis和Sentinel的安装部署和配置

    “火线”和“零线”

    通过索引提升SQL性能案例一则

    如何手动添加jar包到maven本地库?

    1元股权转让的一点思考

    如何打造一个经常宕机的业务系统?

    Linux恢复误删文件的操作

    Linux的scp指令使用场景

    Oracle处理IN的几种方式

    如何搭建一支拖垮公司的技术团队?

    IP地址解析的规则

    MySQL的skip-grant-tables

    国产数据库不平凡的一年

    Oracle要求顺序的top数据检索问题

    日常工作中碰到的几个技术问题

    了解一下sqlhc

    Oracle的MD5函数介绍

    Oracle 19c的examples静默安装

    sqlplus登录缓慢的解决

    VMWare 11安装RedHat Linux 7过程中碰到的坑

    COST值相同?是真是假?

    Oracle 11g的examples静默安装

    同名的同义词和视图解惑

    v$和v_$的一些玄机

    文章分类和索引:

    公众号700篇文章分类和索引

    展开全文
  • 我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在Oracle没有自增主键的设置,我们可以通过这篇文章介绍的方法实现,有需要的朋友们可以参考借鉴,下面来一起看看吧。
  • MySQL创建主键

    2021-02-02 10:34:41
    MySQL InnoDB 存储引擎是必须要有一...创建主键的三种方式:在建表语句字段后指定 PRIMARY KEY 关键字设置主键,这种方式只能定义主键为一个字段的情况,如下所示:CREATE TABLE `t_user` (`id` int(11) NOT NULL A...

    MySQL InnoDB 存储引擎是必须要有一个主键的,主键可以是一个字段或者多个字段,通常建议:主键就一个、主键字段和业务无关、主键字段最好是自增且字段较小(原因:索引原理)。

    创建主键的三种方式:

    在建表语句字段后指定 PRIMARY KEY 关键字设置主键,这种方式只能定义主键为一个字段的情况,如下所示:CREATE TABLE `t_user` (

    `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',

    `name` varchar(32) DEFAULT '' COMMENT '名字'

    ) ENGINE=InnoDB CHARSET=utf8 COMMENT ='用户信息表';

    在建表语句之后,指定 PRIMARY KEY(column1,column2),这种方式可以定义主键为多个字段的情况,如下所示:CREATE TABLE `t_user` (

    `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增主键',

    `name` varchar(32) DEFAULT '' COMMENT '名字',

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB CHARSET=utf8 COMMENT ='用户信息表';

    我个人开发中更常用这种方式

    上面的两个建表语句,如果不在建表的时候就指定主键,会报错 Incorrect table definition; there can be only one auto column and it must be defined as a key,这个报错并非是 InnoDB 强制约束建表语句一定要指定主键,而是因为建表语句中存在自增 AUTO_INCREMENT 的字段,导致建表语句就必须指定主键,去掉自增建表语句不指定主键也是可以的,然后使用 ALTER TABLE 添加主键(这种方式开发用得很少,DBA重建索引可能会用到),如下所示:CREATE TABLE MEIZU_OPENROM.`t_user` (

    `id` int(11) NOT NULL COMMENT '主键',

    `name` varchar(32) DEFAULT '' COMMENT '名字'

    ) ENGINE=InnoDB CHARSET=utf8 COMMENT ='用户信息表';

    ALTER TABLE `t_user` ADD PRIMARY KEY (`id`);

    主键一旦创建,就不能再次添加,一个表如果已经存在主键,再次执行 ALTER TABLE .. ADD PRIMARY KEY (..),会提示定义多个主键的错误: Error Code: 1068\. Multiple primary key defined

    针对第三种建表的情况,如果建表的时候不指定主键,根据索引原理,MySQL InnoDB 存储引擎是必须要有一个主键的,那么,默认会使用什么作为主键呢?默认是不会有主键的,结果就是 insert 可以插入数据,但是 select 和 update 会报错,只有当添加主键之后,才可以select 和 update。

    Tips:查看索引

    查看当前表建立了哪些索引:

    show index from table_name

    来源:oschina

    链接:https://my.oschina.net/calmsnow/blog/4290435

    展开全文
  • sqlserver 创建主键

    2021-07-29 10:45:48
    在新表中创建主键 create table IN_COAST_CMTX( CHECK_TYPE nvarchar(4) ,COMPENSATIONDATE Date ,AGENTCODE nvarchar(10) ,AGENCYCODE nvarchar(10) ,PRODUCTID nvarchar(255) CONSTRAINT [PK_IN_COAST_CMTX] ...
    在新表中创建主键
    create table IN_COAST_CMTX(
     CHECK_TYPE            nvarchar(4)
    ,COMPENSATIONDATE      Date
    ,AGENTCODE             nvarchar(10)
    ,AGENCYCODE            nvarchar(10)
    ,PRODUCTID             nvarchar(255)
    CONSTRAINT [PK_IN_COAST_CMTX] PRIMARY KEY CLUSTERED 
    (
        COMPENSATIONDATE,
        AGENTCODE,
        PRODUCTID
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    );
    PAD_INDEX :是否聚集索引  STATISTICS_NORECOMPUTE: 是否启用统计信息更新 IGNORE_DUP_KEY: 重复键值,为OFF一旦有重复所有行插入失败,为ON只有重复行插入失败不重复的行会插入
    ALLOW_ROW_LOCKS:是否开启行锁  ALLOW_PAGE_LOCKS:是否开启页锁
    
    在现有表上加主键
    ALTER TABLE [dbo].[IN_COAST_CMTX] ADD  CONSTRAINT [PK_IN_COAST_CMTX] PRIMARY KEY CLUSTERED 
    (
        [COMPENSATIONDATE],
        [AGENTCODE],
        [PRODUCTID]
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    
    删除主键
    ALTER TABLE IN_COAST_CMTX DROP CONSTRAINT PK_IN_COAST_CMTX;

    展开全文
  • 需要按照要求给表创建主键、创建索引,创建外键(并设置删除和更新规则) 一、创建主键 ​ 自己创建一个数据库和最少两个表(student表 和 course 表),然后上图:点击创建主键 [外链图片转存失败,源站可能有防盗...
  • ****************创建主键(三种方法)****************创建学生表:第一种:create table student(sno char(5) primary key,/*学号*/ /*可以直接指定主键*/sname char(20) not null,/*姓名*/ssex char(3) not null,/*...
  • Kudu 创建主键

    千次阅读 2019-08-09 23:43:48
    Impala 操作/读写 Kudu,使用druid连接池 Kudu 原理、API使用、代码 Kudu Java API 条件查询 spark读取kudu表导出数据为parquet文件... Kudu 创建主键 每个Kudu 表必须设置Pimary Key(unique), 另外Kudu表...
  • MySQL如何创建主键,外键和复合主键

    千次阅读 2020-11-16 18:27:35
    1.主键语法 ①创建时:create table sc ( studentnoint, courseidint, scoreint, primary key (studentno) ); ②修改时:ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名); 前提是原先没有设置...
  • mysql中创建主键的三种方式 方式一 给uid设置主键 CREATE TABLE user( uid INT PRIMARY KEY, uname VARCHAR(10), address VARCHAR(20) ) 方式二 给uid设置主键 CREATE TABLE user( uid ...
  • SQLServer中创建主键的方法

    千次阅读 2019-09-16 19:21:45
    SQLServer中创建主键的方法 2018年04月07日 09:44:48乘舟御风阅读数 9607 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。 本文链接:...
  • Navicat Premium中Oracle创建主键自增 1.选中表进入设计,选择触发器, 触发器名称,混合不选,每行,出发前,插入时,启用 2.下面展示触发器代码。 // A code block BEGIN SELECT SEQ_EXAM_KNOWLEDGE_BASE....
  • sql语句创建主键

    千次阅读 2016-09-26 11:39:07
    对于有数据的表,在企业管理器里面创建索引时,容易...在已有表里创建主键:alter table t_inputdata add constraint PK_t_inputdata primary key(sysid,appsysid,areaid,siteid,varietyid,sysupday,priceid, pe
  • Oracle创建主键并实现自增

    千次阅读 2018-08-02 18:46:14
    1、创建数据库表 设置主键 create table users(  userid number(10) primary key, /*主键,not null*/  username varchar2(20) ); 附 删除表:drop table users; 2、创建序列自增 CREATE SEQUENCE user_...
  • 分区表不建议创建主键的原因

    千次阅读 2017-06-14 17:31:06
    分区表不建议创建主键的原因 摘要: 分区表尽量不要建主键,因为建主键的同时会建一个唯一性的全局索引,在drop分区表时如果不指定update global indexes则 会使索引失效,导致数据无法入库。 如果非要建主键,...
  • ORALCE 创建主键&唯一约束同时也创建索引原理:主键和唯一约束都是限制表字段值不能重复,必须唯一的约束;当一个表中建有主键或唯一约束时,oracle会自动创建对应主键或唯一约束的索引,这索引是oracle自动...
  • C#如何给DataTable创建主键

    千次阅读 2019-06-14 11:17:39
    private DataTable TblITEM = new DataTable(); TblITEM = MyDataset.Tables[0];//从数据库中查出值给TblITEM ...//PK_SPID为主键名 TblITEM.PrimaryKey = pk; dataGridITEM.DataContext = TblITEM;
  • 复制代码 代码如下: mysql_select_db(“hills_database_test”,$dbcon); $alterpkadd=”alter table hills_testcreatetable ... 您可能感兴趣的文章:深入探寻mysql自增列导致主键重复问题的原因mysql把主键定义为自动
  • 想要在主表上创建一个自增的唯一建,保证这个字段在全局唯一(包括所有子表)。 而又想用 PostgreSQL 10版本的分区表的功能。 但在创建表的时候,出现如下问题。看起来是 PostgreSQL 10版本不支持在分区表上创建 ...
  • 使用序列创建主键

    千次阅读 2018-01-11 11:35:44
    一,什么是序列  序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的...创建序列需 要CREATE SEQUENCE系统权限。序列的创建语法如下: CREATE SEQUENCE 序列名 [INCREMENT BY n

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 427,955
精华内容 171,182
关键字:

创建主键