精华内容
下载资源
问答
  • PK数据库 联合主键和自增主键

    千次阅读 2019-01-09 14:56:57
    提高存储效率索引效率。 索引:如果表的读操作少或者没有,索引效率会高,如果表的写操作较多或者大量,建立索引会慢。 主键的设置方法有3种: 一种是设置自增长主键,第二种是采用业务主键,第三种是生成唯一...

    主键:主键是用来干嘛的?一般来说是为了建立唯一标识,建立索引的。

    主键的使用目的:

    a.为了保证数据查找唯一;

    b.提高存储效率和索引效率。

    索引:如果表的读操作少或者没有,索引效率会高,如果表的写操作较多或者大量,建立索引会慢。

    主键的设置方法有3种:

    一种是设置自增长主键,第二种是采用业务主键,第三种是生成唯一序列(使用uuid/guid);
    如何选择主键设置方式:

    必须按情况来看:

     1.使用业务联合主键:

    a.是否绝大部分查询都是能用上联合主键的查询,并且没有其它查询方式join到这个表,也没有其它索引和外键,那么适合联合主键+cluster key,这样查询效率高一些。

    b.联合主键和自增主键在查询上没什么性能上的区别(前提是索引相同,运用得当)。写的性能上是有区别的,因为联合主键会使用更多的block去创建索引,所以在写操作上性能要低一些。

    2.使用生成唯一的序列
     a.如果不满足使用自增的要求,则建议优先使用字符主键。类似网站数据库,可以采用uuid、guid这类无规则字符做主键。因为字符主键查询速度不比自增主键慢。

    b.UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,是由一个十六位的数字组成,表现出来的形式。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),这样对于分库分表的情况就会很适用。UUID的唯一缺陷在于生成的结果串会比较长。

    c.防止注入式攻击,当我们使用主键自增的时候,需要删除一个东西的时候,一般都是id=?。这样的话我就可以在url中修改这个id的值,这样可能就被人删除了其他东西,UUID这个就是给主键id加上一层锁,使它不暴露给用户;

    3.使用自增主键的场景:

    其它大部分情况仍然适合自增主键。

    展开全文
  • sqlite3中的自增主键和联合主键设置 sqlite操作语句收集 1、sqlite支持建立自增主键,sql语句如下: CREATE TABLE w_user( id integer primary key autoincrement, userename varchar(32), usercname varchar...

    sqlite3中的自增主键和联合主键设置  
    sqlite操作语句收集 

    1、sqlite支持建立自增主键,sql语句如下: 

    CREATE TABLE w_user( 
        id integer primary key autoincrement, 
        userename varchar(32), 
        usercname varchar(32), 
        userpassword varchar(32), 
        userpermission varchar(32), 
        userrole varchar(32), 
        userdesc varchar(32) 
    ); 

    2、联合主键 
    在建表时 

    CREATE TABLE tb_test ( 
        bh varchar(5), 
        id integer, 
        ch varchar(20),
        mm varchar(20),
        primary key (id,bh)
    ); 


    注意:在创建联合主键时,主键创建要放在所有字段最后面,否则也会创建失败
     

    展开全文
  • mysql联合主键自增问题

    千次阅读 2013-07-22 08:41:17
    mysql联合主键自增问题 网上查看资料的时候,偶然看到一篇文章谈到mysql联合主键自增长的问题,该文章提到:   当多列被设为联合主键时,auto_increment属性得列并不是自顾自得一味的增长。 而是配合其他主键...

    http://hi.baidu.com/kinghmx/item/0633c1ec6cda06235b2d6418


    mysql联合主键的自增问题

    网上查看资料的时候,偶然看到一篇文章谈到mysql联合主键自增长的问题,该文章提到:

     

    当多列被设为联合主键时,auto_increment属性得列并不是自顾自得一味的增长。
    而是配合其他主键的列。
    例如:id和vid为联合主键,vid为auto auto_increment,
    当id为1时,vid自动增长;
    当id改变为2时,vid重新归1,从1开始增长。

     

         但是我按照该方法测试的时候,却无法设置联合主键vid自增长?

    执行命令:ALTER TABLE `test_table` CHANGE `vid` `vid` int(11) not null auto_increment;
    提示错误:ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key。

         当时百思不得其解,开始以为是数据库有数据的原因,后来才发现是因为我用的存储引擎是InnoDB的原因。对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

         然后我又建立2张表test1table,test2table用来测试,2张表的结构都是如下三个字段:id,vid,name。id,vid为联合主键,存储引擎都是MyISAM。不同的是:test1table表是id自增长;test2table是vid自增长。
    插入一些数据后发现:
    test1table表id只会自增,不会根据vid的值恢复到1;
    而test2table表vid则会根据id的值的变化,而恢复到1。
    即如果是联合主键第一列(id)自增时,则只会自己自增,不会根据第二列(vid)的值恢复到1。
    只有在联合主键第二列(vid),才会出现我们预期的效果,根据第一列的值的变化会将只恢复到1。结论:
    1、要使用mysql联合主键自增,需使用MyISAM作为存储引擎。
    2、使用联合主键自增的时候,自增键不能是主键最左的键。
    展开全文
  • Oracle联合主键自增

    2017-12-26 11:08:51
    Oracle数据库联合主键自增

    新建表
    这里写图片描述

    CREATE TABLE SCHEDULES
    (
      SCHEDULES_ID NUMBER(19) DEFAULT NULL          NOT NULL,
      USER_ID      NUMBER(19) DEFAULT NULL          NOT NULL
        CONSTRAINT SCHEDULES_USERS_USER_ID_FK
        REFERENCES USERS
        ON DELETE CASCADE,
      DATE_TIME    DATE DEFAULT NULL                NOT NULL,
      EVENT        VARCHAR2(100 CHAR) DEFAULT NULL  NOT NULL,
      CONSTRAINT SCHEDULES_ID_USER_ID_PK
      PRIMARY KEY (SCHEDULES_ID, USER_ID)
    )

    SCHEDULES_ID和USER_ID是联合主键
    **要实现的是:**schedules_id根据user_id的不同自增,例如在user_id=1中,schedules_id最大是3,那么新插入一条user_id=1的记录,使schedules_id=4.user_id=2中,schedules_id最大是5,那么新插入一条user_id=2的记录,使schedules_id=6.

    create or replace trigger tri_scheduleid_insert
    before insert on SCHEDULES
    for each row
      DECLARE
      begin
        select MAX(SCHEDULES_ID)+1 into :new.SCHEDULES_ID from SCHEDULES WHERE USER_ID=:new.USER_ID;
      end tri_scheduleid_insert;

    直接使用触发器实现,不用创建sequence。

    但是当MAX(SCHEDULES_ID)不存在时,会无法插入
    修改后触发器的创建是

    CREATE OR REPLACE TRIGGER tri_scheduleid_insert
    BEFORE INSERT ON SCHEDULES
    FOR EACH ROW
      DECLARE
        nextid NUMBER;
      BEGIN
        SELECT MAX(SCHEDULES_ID) + 1
        INTO nextid
        FROM SCHEDULES
        WHERE USER_ID = :new.USER_ID;
        IF INSERTING
        THEN
          IF nextid > 0
          THEN
            :new.SCHEDULES_ID := nextid;
          ELSE :NEW.SCHEDULES_ID := 1;
          END IF;
        END IF;
    
      END tri_scheduleid_insert;

    首先定义一个变量nextid来保存查询得到的最大值+1,如果nextid大于0,则说明插入记录的user_id的值存在,schedules_id=nextid;否则
    说明插入记录的user_id的值不存在,使schedules_id=1;
    注意: :new.SCHEDULES_ID := nextid;
    赋值等号左边的“:”

    同样的思考应该可以不创建sequence来创建触发器实现主键的自增。我没有做,毕竟创建sequence还是有好处的。这里联合主键的自增我没找到有关sequence的实现。如果有更好的办法请留下你的建议。

    展开全文
  • 联合主键自增问题今天上午闲来无事翻看了下数据库分类表的设计,看到这样一幕:当时我好奇的是怎么cateId自增会存在重复值的问题,然后翻看了下主键是由siteIdcateId组成。所以进行了查阅资料:当多列组成联合...
  • 联合主键自增问题 今天上午闲来无事翻看了下数据库分类表的设计,看到这样一幕: 当时我好奇的是怎么cateId自增会存在重复值的问题,然后翻看了下主键是由siteIdcateId组成。所以进行了查阅资料: 当多列...
  • mysql中使用联合主键并设置非主键自增 数据库里有三个三字段,id , wire_id, station_id。 其中wire_id+station_id合一起不允许重复(单独的某一个允许重复) 并且id需要实现自增 ### 尝试一:(未成功) 将wire...
  • 联合主键自增

    2013-02-05 21:08:29
    比如有一个表,innodb,有两个字段 AID ,BID 现在想实现这种: AID,BID 1 1 1 2 2 1 1 3 2 2 ..... ...AID由程序自己赋值插入,BID由数据库根据AID的不同自增! 能实现这种方式吗?
  • Hibernate使用联合主键,非主键自增

    千次阅读 2015-09-23 09:10:54
    (重要)Hibernate使用联合主键时,有一个字段不是主键,但想自增时,在该字段的配置文件加上(insert=”false”,update=”false”)即可。如下: </prope
  • 设置复合主键中某一主键自增

    千次阅读 2015-09-09 14:32:48
    设置复合主键中某一主键自增...oracle没有ORACLE自增字段这样的功能,但是通过触发器(trigger)序列(sequence)可以实现。 create table t_client (id number(4) primary key, pid number(4) not null, name varcha
  • 网上查看资料的时候,偶然看到一篇文章谈到mysql联合主键自增长的问题...idvid为联合主键,vid为auto auto_increment,当id为1时,vid自动增长;当id改变为2时,vid重新归1,从1开始增长。    但是我按照该方...
  • 一张表,有id,name,age三个字段 要求id自增 name,age做联合主键 判断数据是否唯一 应该怎么做
  • mysql主键id自增顺序错乱修正方法

    千次阅读 2020-04-07 09:40:11
    Mysql数据库表的自增主键ID号乱了,需要重新排列。 原理:删除原有的自增ID,重新建立新的自增ID。 1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段: ALTER TABLE `table_name` ADD `id...
  • MySQL联合主键自增分别产生递增id

    千次阅读 2018-11-10 19:30:11
    user_no表是先把dept,id设为联合主键,然后把id设为自增长, 那么插入该表时,每插入一条财务部的数据,id就会自增长一次,每插入研发部数据,id也会分别增长一次, 也就是说,id的自增长是按dept分组的。 ...
  • hibernate联合主键其中某个字段自增能实现吗?
  • hibernate 联合主键配置 sid自增

    千次阅读 2016-07-28 10:40:50
    -- key-property标签表示哪一些属性对应复合主键 --> <key-property name="roleId" column="roleId" type="integer"></key-property> <key-property name="functionId" column="functionId" type="integer"></key-...
  • mysql 修改主键自增,新增联合主键

    千次阅读 2017-03-26 14:10:37
    添加字段3 alter table tbname add 字段3 varchar(10); 删除主键 alter table tbname drop primary key; 添加主键 alter table tbname add primary key(字段1,2,3);
  • 我们知道django的orm想实现自增,可以直接使用AutoField字段既可以实现,但是这种情况必须要求此字段是主键,但是我们知道主键只能是一个。如果我已经有了一个主键,但是又需要另外一个字段为唯一自增字段,这该如何...
  • sqlite3中的自增主键和联合主键设置

    万次阅读 2015-03-25 11:53:16
    如何在sqlite3中设置自增主键和联合主键
  • Oracle数据库不存在主键自增选项,现在想实现ID自增。 博客链接:oracle 实现插入自增列   打开Navicat,定位到自己创建的表。 一、 创建序列 其他-序列 填写相应的信息,特别注意:表数据为空的话,开始值...
  • ALTER TABLE ‘tableName’ DROP PRIMARY KEY --删除主键 ALTER TABLE ‘tableName’ ADD PRIMARY KEY(id...ALTER TABLE ‘tableName’ ADD ‘id’ INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT --创建自增主键 ...
  • 创建数据表格,设置主键自增 创建数据库时,启用主键自增加特性 Create table testTable (id INTEGER PRIMARY KEY AUTOINCREMENT,。。。。 注意事项:设置主键自增时(AUTOINCREMENT),主键类型必须是INTEGER,不能...
  • MySQL:自增主键VS非自增主键

    千次阅读 2020-05-29 09:22:36
    使用自增主键的好处 每次插入新的记录,记录就会顺序的添加到当前索引节点的后续位置,当一页写满,就会自动开辟一共新的页。 使用非自增主键坏处 由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有...
  • 使用 LINQ , 向数据库中插入一条数据。 会报出 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'RoleInfo' 中的标识列插入显式值。 原因是因为在数据库表中,有标识列,而标识列又不允许修改。...
  • sqlite3:自增主键联合主键

    千次阅读 2014-01-03 09:10:57
    原文地址:... 1、sqlite支持建立自增主键,sql语句如下:  CREATE TABLE w_user(  id integer primary key autoincrement,  userename varchar(32), 
  • public class GirlPK implements Serializable { ...想让GirlPK做Girl的复合主键,并且想让id自增。只想通过加Annotation的方式实现,跪求大大们应该都在什么地方加那些Annotation能实现效果,小弟感激不尽。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,015
精华内容 6,806
关键字:

联合主键和自增主键