精华内容
下载资源
问答
  • 所以检索不是什么问题, 何况是根据表名来检索(表名列已是主键)。 2:并发问题。 很多人有提到!不过凡事都是一把双刃剑,这就好比做优化,要么以时间换空间,要么以空间换时间,这个世界上根本不存十全十美的...

    在平时的项目开发中,我相信有很大一批人都在用这个数据库自增ID,用数据库自增ID有利也有弊。
    优点:节省时间,根本不用考虑怎么来标识唯一记录,写程序也简单了,数据库帮我们维护着这一批ID号。
    缺点:for example, 在做分布式数据库时,要求数据同步时,这种自增ID就会出现严重的问题,因为你无法用该ID来唯一标识记录。同时在数据库做移植时,也会出现各种问题,总 之,对此自增ID有依赖的情况,都有可能出现问题。我绝对相信园子里有很一部分人都被这个“好用的东西” 曾经害惨过!

    我平时在开发项目的时候,一般都没有用到数据库的自增ID, 所以我想分享一下自己的解决方法。

    解决思路:

    1:定义一张表,专门用来存放存所有需要唯一ID的表名称以及该表当前所使用到的ID值。
    2: 写一个存储过程,专门用来在上一步的表中取ID值。
    这个思路非常简单,我不作解释了,直接来看看我的实现方法:

    第一步:创建表
    create table table_key
    (
    table_name varchar(50) not null primary key,
    key_value int not null
    )

    第二步:创建存储过程来取自增ID
    create procedure up_get_table_key
    (
    @table_name varchar(50),
    @key_value int output
    )
    as
    begin
    begin tran
    declare @key int

    –initialize the key with 1
    set @key=1
    –whether the specified table is exist
    if not exists(select table_name from table_key where table_name=@table_name)
    begin
    insert into table_key values(@table_name,@key) –default key vlaue:1
    end
    – step increase
    else
    begin
    select @key=key_value from table_key with (nolock) where table_name=@table_name
    set @key=@key+1
    –update the key value by table name
    update table_key set key_value=@key where table_name=@table_name
    end
    –set ouput value
    set @key_value=@key

    –commit tran
    commit tran
    if @@error>0
    rollback tran
    end

    对于在表中不存在记录,直接返回一个默认值为1的键值,同时插入该条记录到table_key表中。而对于已存在的记录,key值直接在原来的key基础上加1.

    总结一下,这种方法非常简单,我说一下它的优缺点。

    优点:
    1:ID值是可控的。用户可以从指定段开始分配ID值,这对于在分布式数据要求同数据同步时,非常方便,很好地解决了ID重复的问题。
    2:在编写程序中,ID值是可见的,比如在再插入关联的记录时,相比使用数据库自增ID的情况下,这种方法不需要在插入一条数据库记录之后,再去得到自增ID值,然再再使用该ID的值来插入关联的记录。我们可以一次性使用事务来插入关联记录。

    3:对于需要批量插入数据时,我们可以改写一下上面的存储过程,返回一个段的开始ID,然后更新表时需要注意,不是原来的简单的递增1,而是递增你想要的插入多少条记录的总数。

    缺点:
    1:效率问题,每次取ID值都需要调用存储过程从数据库中检索一次。对于这种情况,我觉得效率不是很大问题,因为SQL server 会对我们经常调用的存储过程有缓存,再一点,这个表的数据应该不会很大,最多上千条(一个项目中上千个表的情况应该不是很多吧)。所以检索不是什么问题, 何况是根据表名来检索(表名列已是主键)。

    2:并发问题。
    很多人有提到!不过凡事都是一把双刃剑,这就好比做优化,要么以时间换空间,要么以空间换时间,这个世界上根本不存十全十美的事物!

     

    引用自 :http://www.mianwww.com/html/2011/11/11674.html

    转载于:https://www.cnblogs.com/zhangchenliang/archive/2011/11/14/2249072.html

    展开全文
  • 所以检索不是什么问题,何况是根据表名来检索(表名列已是主键)。 2:并发问题。 很多人有提到!不过凡事都是一把双刃剑,这就好比做优化,要么以时间换空间,要么以空间换时间,这个世界上根本不存十全十美的...

    在平时的项目开发中,我相信有很大一批人都在用这个数据库自增ID,用数据库自增ID有利也有弊。 优点:节省时间,根本不用考虑怎么来标识唯一记录,写程序也简单了,数据库帮我们维护着这一批ID号。 缺点:for example, 在做分布式数据库时,要求数据同步时,这种自增ID就会出现严重的问题,因为你无法用该ID来唯一标识记录。同时在数据库做移植时,也会出现各种问题,总之,对此自增ID有依赖的情况,都有可能出现问题。我绝对相信园子里有很一部分人都被这个“好用的东西” 曾经害惨过!

    我平时在开发项目的时候,一般都没有用到数据库的自增ID, 所以我想分享一下自己的解决方法。

    解决思路:

    1:定义一张表,专门用来存放存所有需要唯一ID的表名称以及该表当前所使用到的ID值。 2: 写一个存储过程,专门用来在上一步的表中取ID值。 这个思路非常简单,我不作解释了,直接来看看我的实现方法:

    第一步:创建表 create table table_key ( table_name varchar(50) not null primary key, key_value int not null )

    第二步:创建存储过程来取自增ID create procedure up_get_table_key ( @table_name varchar(50), @key_value int output ) as begin begin tran declare @key int

    –initialize the key with 1 set @key=1 –whether the specified table is exist if not exists(select table_name from table_key where table_name=@table_name) begin insert into table_key values(@table_name,@key) –default key vlaue:1 end – step increase else begin select @key=key_value from table_key with (nolock) where table_name=@table_name set @key=@key+1 –update the key value by table name update table_key set key_value=@key where table_name=@table_name end –set ouput value set @key_value=@key

    –commit tran commit tran if @@error>0 rollback tran end

    对于在表中不存在记录,直接返回一个默认值为1的键值,同时插入该条记录到table_key表中。而对于已存在的记录,key值直接在原来的key基础上加1.

    总结一下,这种方法非常简单,我说一下它的优缺点。

    优点: 1:ID值是可控的。用户可以从指定段开始分配ID值,这对于在分布式数据要求同数据同步时,非常方便,很好地解决了ID重复的问题。 2:在编写程序中,ID值是可见的,比如在再插入关联的记录时,相比使用数据库自增ID的情况下,这种方法不需要在插入一条数据库记录之后,再去得到自增ID值,然再再使用该ID的值来插入关联的记录。我们可以一次性使用事务来插入关联记录。

    3:对于需要批量插入数据时,我们可以改写一下上面的存储过程,返回一个段的开始ID,然后更新表时需要注意,不是原来的简单的递增1,而是递增你想要的插入多少条记录的总数。

    缺点: 1:效率问题,每次取ID值都需要调用存储过程从数据库中检索一次。对于这种情况,我觉得效率不是很大问题,因为SQL server 会对我们经常调用的存储过程有缓存,再一点,这个表的数据应该不会很大,最多上千条(一个项目中上千个表的情况应该不是很多吧)。所以检索不是什么问题,何况是根据表名来检索(表名列已是主键)。

    2:并发问题。 很多人有提到!不过凡事都是一把双刃剑,这就好比做优化,要么以时间换空间,要么以空间换时间,这个世界上根本不存十全十美的事物!

     

     

     

    转载于:https://www.cnblogs.com/sammon/archive/2012/04/17/2454234.html

    展开全文
  • 那么,我们要如何为DataTable设置主键及利用主键在DataTable索引值呢? 步骤/方法 为DataTable设置主键 DataTable的主键属性为PrimaryKey,利用该属性,我们可以设置或者获取DataTable的主键。因为...

    只要是数据集中都应该存在主键,以确定数据集中唯一的值。那么,我们要如何为DataTable设置主键及利用主键在DataTable索引值呢?

    步骤/方法

     
      1.  

        为DataTable设置主键

        DataTable的主键属性为PrimaryKey,利用该属性,我们可以设置或者获取DataTable的主键。因为DataTable的主键和SQL Server的主键一样,存在联合主键的问题,所以PrimaryKey应该是一个DataColumn数组。我们可以先设置一个DataColumn数组,当然,这个数组中的列都应该是该DataTable中的列。然后将这个数组赋给PrimaryKey属性作为DataTable的主键。

      2.  

        //先声明一个DataTable
        DataTable dt = new DataTable();
        dt.Columns.Add("A");
        dt.Columns.Add("B");
        dt.Columns.Add("C");
        dt.Columns.Add("D"); 

      3.  

        //然后我们将列A与列B作为dt的联合主键
        DataColumn[] cols = new DataColumn[] { dt_smartgrid.Columns["A"], dt_smartgrid.Columns["B"] };
        dt.PrimaryKey=cols;

        很简单,我们就为dt设置好主键了。

      4. 4

        利用主键查找行数据

        上一步我们已经为DataTable设置好主键,这一步我们演示如何利用主键查找数据。
        首先我们要声明一个object[]数据,对应主键的数组中列的值,如上面的主键数组,我们声明一个object[]数组并赋值。
        示例:

        object[] objs=new object[]{"school","class"};
        DataRow dr=dt.Rows.Find(objs);

        上面的dr就是我们利用主键查找出来的唯一的行。

    转载于:https://www.cnblogs.com/Robert-huge/p/5795775.html

    展开全文
  • 首先创建一张表: create table cloud( id NUMBER(3) PRIMARY KEY, name VARCHAR2(20), address VARCHAR2(20) ... create sequence autoid increment by 1 start with 1 minvalue 2 maxvalue 100 / ...

    首先创建一张表:

    create table cloud(

    id NUMBER(3) PRIMARY KEY,

    name VARCHAR2(20),

    address VARCHAR2(20)

    );

    步骤1:创建序列

    create sequence autoid
    increment by 1
    start with 1
    minvalue 2
    maxvalue 100
    /

    步骤2:为相应的表创建触发

    create or replace trigger trg_cloud
    before insert on cloud
    for each row   --每操作一行就触发一次,默认是表级触发器(无论触发多少行之触发一次)
    begin
    select autoid.nextval into:new.id from dual;
    end;
    /

     

    转载于:https://www.cnblogs.com/yueliming/archive/2013/01/18/2866584.html

    展开全文
  • mybatis+ mysql 怎样实现主键自增

    千次阅读 2018-06-19 10:54:07
    1.mybitis xml配置<insert id="insert" parameterType="student"keyProperty="studentId" useGeneratedKeys="... 含义:设置是否使用JDBC的getGenere...
  • 序列 create sequence FIXED_ASSETS_TYPE_SE minvalue 1 maxvalue 9999999999999999999999999999 start with 1 increment by 1 nocache; 触发器 create or replace trigger FIXED_ASSETS_TYPE_TRI......
  • Oracle中没有已定义好的自动编号列,需要自己创建 1、创建表  create table test(id int,  name varchar(32))  2、创建序列  create sequence TID_seq  minvalue 1  maxvalue 999999  ...
  • 如图,username我已经设置主键了,但是插入居然允许同样的值,这是为什么?怎样避免这种情况? 如下,这张图时表的设计。 ![图片说明](https://img-ask.csdn.net/upload/201911/06/1573025865_387596.png)
  • oracle主键自动增长

    2018-04-26 11:19:30
    oracle的主键没有自动怎样功能,小编今天给大家说说怎样设置主键自动增长: 1、创建表; create table tb_user ( id NUMBER(10) not null, createtime DATE not null, constraint PK_tb...
  • 有关MyBatis中的主键设置问题

    千次阅读 2017-11-17 11:14:11
    我们知道在往数据库插入数据的时候,大多...那么在MyBatis中要怎样来使用相应数据库中的特性来设置主键呢?下面的例子中,我们使用User(userId,userName)来做相应的测试如何使用MySQL等数据库的自增属性我们可以设置us
  • 在mysql中,假设我们定义的主键是 intunsigned,所以最大可以达到2的32幂次方 - 1 = 4294967295,这时候我们将AUTO_INCREMENT设置为最大值,然后来插入数据会得到一个异常 insert into t1 values(null) Error Code: ...
  • 用hibernate annotation设置联合主键时可以让其中一个或者多个自增吗,如果可以应该怎样做呢,对这个问题很感兴趣! ...
  • 怎样在oracle的表中建联合主键

    千次阅读 2010-09-15 14:07:00
    在建表中,设置外键时出现这个错误:ORA-02270:此列列表的唯一或主键不匹配
  • mysql中主键设置自动增长,删除几条记录后,新增的主键不是现在主键的下一个,而是所有记录中的下一个,求怎样获取下一个主键值
  • <code>alter table 职工 add constraint FK_职工_仓库 foreign key (仓库号) references 仓库(仓库号)</code></pre> 显示错误如下 <p>ALTER TABLE 语句与 ...已经将仓库_仓库号设置主键,职工表也有主键</p>
  • 在删除主键索引的情况下 mysql怎样可以设置物理排序,
  • 在之前的使用过程中,是用的oracle,只需要用注解的方式在主键上加@...这样设置之后,主键就相当于是自增型的了,我也不太清楚其中的道理 各位大侠,请问后面这种解决方式好吗?或者说要怎样完美的解决这个问题呢?
  • ID 是主键. CREATE TABLE test_main ( id INT, value VARCHAR(10), PRIMARY KEY(id) ); -- 创建测试子表. CREATE TABLE test_sub ( id INT, main_id INT, value VARCH...
  • 在mysql中主主复制中,需要注意的一个重要的问题: 如果我们现在有AB两个客户,在同一时间内,需要插入两条数据 那么现在就会出现冲突,...我们可以将两个表的步长设置为2,起始的主键以单双数来区分 即: A表:1,
  • 在mysql中有一个非主键不可重复字段(目前该字段没设置unique属性) 现在插入一条数据前端传来的数据 如果该字段设置成unique属性 我该怎样给前端返回错误的message(可能会有其它插入错误,目前只统一设置...
  • 最近做的项目都是存的自增ID,就遇到了一个问题,存到数据库后,怎样马上得到他的主键ID?我之前用的都是UUID,这样的话我能得到主键ID,但是自增的话,就得不到了,我就蒙了,但是今天同事告诉了我一个好的解决方法...
  • PD怎样能使主键id使用MySQL的auto_increment呢? ◇解决方法: 打开tableproperties窗口→columns→选中id列→打开columnsproperties窗口→勾选identity即可 注意:概念模型没有此选项,物理模型才有 2...
  • 在hibernate中,怎样配置主键自增长? 要求是ID从10000开始增长,如何配置呢? 这个是32位自增长,那么是Int类型怎么设置?   <p><id name="id" type="java.lang.String">  <column length="32" ...
  • PD怎样能使主键id使用MySQL的auto_increment呢?  ◇解决方法:  打开table properties窗口 → columns → 选中id列 → 打开columns properties窗口 → 勾选identity即可  注意:概念模型没有此选项,物理模...
  • powerdesigner的一些常用的设置

    千次阅读 2013-03-31 12:35:57
    PD怎样能使主键id使用MySQL的auto_increment呢? ◇解决方法: 打开tableproperties窗口→columns→选中id列→打开columnsproperties窗口→勾选identity即可 注意:概念模型没有此选项,物理模型才有 2...
  • 1、创建一个主键ID自增的表(自增ID设置为最大值) CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `content` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_...
  • 表结构如下: ...(数据库隔离级别设置的方法就不要考虑了。select加for update好像也不适用。) by the way insert into 表(table_name) values (select....)这种方式和上边说的那种方式一样吗???
  • PD怎样能使主键id使用MySQL的auto_increment呢? ◇解决方法: 打开tableproperties窗口→columns→选中id列→打开columnsproperties窗口→勾选identity即可 注意:概念模型没有此选项,物理模型才有 ...

空空如也

空空如也

1 2 3 4
收藏数 79
精华内容 31
关键字:

怎样设置主键