精华内容
下载资源
问答
  • 可是当我初次去读取该表的这个新增字段时,程序一直报错,而代码的写法和以前一模一样,根本看不出出现问题的原因。2.初始状态 我给表新增加字段时,使用了类似如下的SQL语句:ALTER TABLE [CSL_TABLE_A] add ...

    1.问题描述
    最近做的一个东西需要存盘,出于一些原因,打算将存盘的数据放在一张已经存在的表中,这样只需要在这张表里新增一列即可。可是当我初次去读取该表的这个新增字段时,程序一直在报错,而代码的写法和以前一模一样,根本看不出出现问题的原因。

    2.初始状态
    在我给表新增加字段时,使用了类似如下的SQL语句:

    ALTER TABLE [CSL_TABLE_A] add [NewData] [varchar][max] NOT NULL 

    但运行结果显示错误:

    ALTER TABLE 只允许添加满足下述条件的列:列可以包含Null值;或者列具有指定的
    DEFAULT定义;或者要添加的列是标识列或时间戳列;或者,如果前几个条件均未满足,则表必须为空以允许添加此列。

    当时没有想太多,直接将NOT NULL改为了NULL,以允许包含Null值。这样一来增加新字段是成功了,然后你可以在SQL Server Management Studio中看到该字段显示的“默认值”为NULL。这看上去没任何问题,但在程序中去读取时,问题就出来了。
    读取的代码为:

    //_RecordsetPtr rs;
    string strTemp = (const char *)(_bstr_t(rs->GetCollect("NewData")));

    通过调试,发现rs->GetCollect(“NewData”)读取出来的值,正是上面显示的”默认值”NULL,当把NULL构造成_bstr_t类型对象时,错误就发生了。

    3.解决方法
    一种办法是在添加新字段时指定一个默认值:

    ALTER TABLE [CSL_TABLE_A] add [NewData] [varchar][max] NOT NULL default ''

    表示该字段的值默认为空字符

    展开全文
  • mysql在已有主键的表中新增自增长字段

    千次阅读 热门讨论 2019-09-08 21:11:32
    如标题所示,给数据表加自增长字段是很简单的事情,但是如果这个表已经主键,并且存在数据的情况下,怎么给数据表加自增长主键呢?下面咱们来详细说一下这个东东。 1、目标需求: (1)数据表没有id字段,但是个...

    一、前言

          如标题所示,给数据表加自增长字段是很简单的事情,但是如果这个表已经有主键,并且存在数据的情况下,怎么给数据表加自增长主键呢?下面咱们来详细说一下这个东东。

    1、目标需求:

    (1)数据表没有id字段,但是有个char类型的字段作为主键使用。
    (2)表中没有其他自增长的字段
    (3)但是根据需求,需要重新加上id字段,新加的字段不用是主键,但是这个字段必须是自增长且是唯一字段。
    

    2、数据表结构如下:

    | redeem_code | CREATE TABLE `redeem_code` (
      `code` char(10) NOT NULL,
      `gift_id` int(10) unsigned NOT NULL DEFAULT '0',
      `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
      PRIMARY KEY (`code`) USING BTREE,
      KEY `idx_gift_id_user_id` (`gift_id`,`user_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT   
    

    二、给数据表加上自增长且唯一索引字段(无数据)

    1、给数据表新增自增字段的前提

          但如果表中已经有了主键,我们要添加其他字段的属性为自增长,那么必须满足条:

    (1)这个字段是int类型
    (2)这个字段带有索引key,最好是unique,不过普通的key也是可以的
    (3)这个字段不能有默认值(因为默认字段是相同的,会影响到unique key的添加)
    

    2、给没有主键的表新增自增长字段

    如果表中没有主键也没有自增长的时候,可以一句话加上去:

    alter table redeem_code change id id int not null auto_increment primary key;
    

          但是如果表已经创建成功,并且设置完主键之后,那么这句话就不会有什么作用,反而会报错,报错信息大概是:数据表中不能存在多个主键。

    3、给已有主键的表新增自增长字段

          这边博主本来是想一句sql就完事的,但根据上面咱们查到的结果,新增的字段必须是有索引的,而索引和新增字段写在一个sql,目前博主只会一种写法,就是在新增字段的时候添加unique key,其他的写法还不知道。因此这边是分句执行的,结果如下:

    alter table redeem_code add id int(10) not Null;   //不要设置default 0,会报错:Invalid default value for ‘id’
    alter table redeem_code add unique idx_id(`id`);   //设置唯一索引,方便加自增长属性
    alter table redeem_code modify column id int(10) not null AUTO_INCREMENT;  //这句执行成功
    

    4、关于重新更改字段的属性问题

          细心的同学应该注意到了,上面最后设置自增长属性的时候,博主对字段的其他属性进行了重新定义,这是为什么呢?

    注意:alter table redeem_code modify column id AUTO_INCREMENT;   //直接执行这句会报错
    

          直接设置id字段的类型为自增长,mysql会报错,具体的报错信息忘记保存了,不过在博主的不断尝试下,发现重新定义字段属性的时候,是可以设置自增长的。

    推测原因:
          推测是因为对于字段加自增长的时候,对于mysql的表结构是有影响的。我们都知道一个数据表中只能有一个自增长列,虽然这个表中有主键code,但这个code是个随机值,mysql每次存储数据,并不会顺序写入数据页,而是随机写入,然后还要不断的移动表数据,适应插入的LRU算法,从而造成性能的浪费。但是如果这个时候,表中有自增长的字段,猜测mysql是会依据这个字段和主键共同进行数据的定位的,所以原来这个字段的属性结构要重新定义,并且也务必要保证自增长的字段是Int类型的。(PS:如果大佬们有更权威的说法,欢迎一起讨论!

    5、查看数据库结构

    ------------------------------------------------------------------------------------+
    | redeem_code | CREATE TABLE `redeem_code` (
      `code` char(10) NOT NULL,
      `gift_id` int(10) unsigned NOT NULL DEFAULT '0',
      `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
      `id` int(10) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`code`) USING BTREE,
      UNIQUE KEY `idx_id` (`id`),
      KEY `idx_gift_id_user_id` (`gift_id`,`user_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT 
    

          OK,这里看到我们已经成功设置新字段id为自增长且是unique key的了。但是设置成功的前提是这个表中没有其他数据。下面我们试一下当有数据的情况下,怎么设置自增长字段。

    三、给数据表加上自增长且唯一索引字段(有数据)

    1、表中新增3行数据,并按照上面方法进行设置

    +---------+---------+---------+----+
    | code    | gift_id | user_id | id |
    +---------+---------+---------+----+
    | 111111  |      11 |     111 |  0 |
    | 2222222 |      22 |     222 |  0 |
    | 333333  |      33 |     333 |  0 |
    +---------+---------+---------+----+
    

          执行到添加unique KEY的时候就报错了,因为是Int类型,而且在我们没有设置默认值的情况下,默认加进去的id都是0,所以重复了,不符合添加unique key的条件。

    2、试试varchar类型字段

    (1)先varchar()类型,后续改为int类型:

    alter table redeem_code add id varchar(10) not Null default '1'; 
    alter table redeem_code add unique idx_id(`id`);  //Duplicate entry '' for key 'idx_id'  
    	还是不行,毕竟多条数据的这个字段的值是相同的。试试普通的index试试
    

    (2)改为普通的key

    alter table redeem_code add id varchar(10) not Null default '1'; 
    alter table redeem_code add index idx_id(`id`);   //普通的key是可以的
     alter table redeem_code modify column id int(10) not null AUTO_INCREMENT;   //成功了,
    

    (3)查看表结构

    | redeem_code | CREATE TABLE `redeem_code` (
      `code` char(10) NOT NULL,
      `gift_id` int(10) unsigned NOT NULL DEFAULT '0',
      `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
      `id` int(10) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`code`) USING BTREE,
      KEY `idx_gift_id_user_id` (`gift_id`,`user_id`) USING BTREE,
      KEY `idx_id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT |
    

    主要就是key的类型变了,代表普通的key还是可以的。

    3、使用默认的索引设置

    alter table redeem_code add id varchar(10) not Null default '1';
    alter table redeem_code change id id int(10) not null auto_increment key;     
    

    报错: Multiple primary key defined //如果不用unique key的话,默认是选用pramary key,所以就主键重复了。

    四、其他问题

    1、使用尽可能简洁的sql

    (1)一句sql试试

    alter table redeem_code change  id int(10) not null auto_increment  key;
    

    报错: Unknown column ‘id’ in ‘redeem_code’
    原因:缺少id字段导致的,下面加上id字段就好了。

    (2)两句sql试试

    alter table redeem_code add id varchar(10) not Null default '1'; 
    alter table redeem_code change id id int(10) not null auto_increment unique key;
    

    答案是可以的。。,就是不能放在一句执行完了,必须要分开两句

    2、设置之后,所有表的autoincrememt都是从下一条记录开始增长的。

          这个问题在网上查了挺久的,如果表中无数据或者数据不是很重要(量少)的话,可以先导出来,然后重新插入生成自增长的值。但如果数据量很大怎么办呢?

    个人觉得可行的方案:

    (1) 自动脚本程序,通过程序依次为数据表插入自增的值,但为了防止影响业务,最好是选择夜深人静数据库压力小的时候,可以考虑主从,先更新主库,业务放在从库上。

    (2) 如果想让原来的自动增长就得复制现有表的结构(无id),添加id并加上AUTO_INCREMENT,然后通过循环,添加n条空记录,然后对应先前表的id,依次插入数据。如果跟其他表有关联就比较麻烦了

    3、如果表中有数据,设置自增长和unique怎么办

          其实从上面的测试来看,我们发现在有数据的情况下,分步设置自增长和unique是会报错的,因为在设置新字段的时候,会给每行数据都加一个默认的值,而这些默认值是相同的,所以设置unique key的时候就会报错。

    建议方案:

    (1)先设置自增长和普通的key
    (2)使用程序把新增字段的值都按照顺序添加进去
    (3)当字段的值各不相同的时候,再修改为unique key
    

          当然,这个方案看起来笨笨的,归根结底,还是因为不能把这些sql都总结到一句上去,如果有大佬看到这篇博客,那么请告知怎么一句话设置这个sql,谢谢了!

          完成功能很简单,但是想要弄明白点,就势必要付出时间去测试了。博主这边测试的也不够多,欢迎各位同僚前来探讨,哈哈。

    =========2019/9/9 11:07更新 ========

    2019/9/9 11:07更新:

    大佬的力量果然是惊人的,上午经过另一位大佬的指点,终于得到一条sql就实现了咱们的需求,如下:

    ALTER TABLE `redeem_code` ADD COLUMN `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT AFTER `user_id`,ADD UNIQUE INDEX `unq_id`(`id`);
    

    查看表结构:

    | redeem_code | CREATE TABLE `redeem_code` (
      `code` char(10) NOT NULL,
      `gift_id` int(10) unsigned NOT NULL DEFAULT '0',
      `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`code`) USING BTREE,
      UNIQUE KEY `unq_id` (`id`),
      KEY `idx_gift_id_user_id` (`gift_id`,`user_id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT  
    

          经过测试,不管是有没有数据,都可以使用这条sql,直接就加进去了,更重要的是,加进去id字段之后,表中的id是会自己从1开始填充的,这样的话就解决了困境。表数据显示如下:

    +-------+---------+---------+----+
    | code  | gift_id | user_id | id |
    +-------+---------+---------+----+
    | 11111 |       0 |       0 |  1 |
    | 2222  |      22 |       1 |  2 |
    +-------+---------+---------+----+
    
    

          表中原来是有两条数据的,现在新增的id都是自增长的,完美解决了问题。这样比着咱们上面分开写sql不知道高明了多少,哈哈,学到了。本来觉得上面也没有必要存在了,但是毕竟是探索过程,还是留下吧。

    end

    展开全文
  • 在数据表的 已有数据字段 后增添新的字段,这时候会默认你增添的新的字段已经有了数值(可能是 0,是NULL,是空);这个时候,向新增字段中添加数据时,数据表会默认新的一行中添加数据(这就是为什么我向...
  • Elasticsearch索引新增字段

    千次阅读 2020-12-19 20:24:24
    最近公司做的一个需求,需要将现已有的50+万数据的索引新增一个字段,之前没有索引中加过字段,记录一下新增字段的方法。 首先需要有一个已经存在的索引,下面先创建一个索引skus PUT /skus { "settings": { ...

    最近公司做的一个需求,需要将现已有的50+万数据的索引新增一个字段,之前没有在索引中加过字段,记录一下新增字段的方法。

    首先需要有一个已经存在的索引,下面先创建一个索引skus

    PUT /skus
    {
      "settings": {
        "number_of_shards": 2,
        "number_of_replicas": 1
      }, 
      "mappings":{
          "properties":{
          "sku_id":{
            "type":"long"
          },
          "sku_name":{
            "type":"text"
          },
          "sku_picture_url":{
            "type":"keyword"
          }
        }
      }
    }
    
    =============================
    //创建成功
    {
      "acknowledged" : true,
      "shards_acknowledged" : true,
      "index" : "skus"
    }

    先查看一下刚创建的索引:

    GET /skus/_mapping

    索引信息:

    {
      "skus" : {
        "mappings" : {
          "properties" : {
            "sku_id" : {
              "type" : "long"
            },
            "sku_name" : {
              "type" : "text"
            },
            "sku_picture_url" : {
              "type" : "keyword"
            }
          }
        }
      }
    }

     下面在上面的索引上面新增字段:

    //使用如下格式新增字段
    PUT /skus/_mapping
    {
      "properties":{
        "sku_extendInfo":{
          "type":"text"
        },
        "sku_stock":{
          "type":"integer"
        }
      }
    }
    
    ==========================
    //新增成功
    {
      "acknowledged" : true
    }

     现在查看新增字段之后的索引信息:

    {
      "skus" : {
        "mappings" : {
          "properties" : {
            "sku_extendInfo" : {
              "type" : "text"
            },
            "sku_id" : {
              "type" : "long"
            },
            "sku_name" : {
              "type" : "text"
            },
            "sku_picture_url" : {
              "type" : "keyword"
            },
            "sku_stock" : {
              "type" : "integer"
            }
          }
        }
      }
    }

    好了,索引新增字段成功!

    展开全文
  • sqlite新增字段

    千次阅读 2019-07-05 13:39:26
    不支持字段名称的改变,但是可以新增字段 1.修改表名称 ALTER TABLE 旧表名 RENAME TO 新表名 eg:ALTER TABLE or_sql_tableRENAME TO new_table; 2.添加字段 ALTER TABLE 表名 ADD COLUMN 列名 数据类型 ...

    sqlite只支持部分的表结构改变的功能

    不支持字段名称的改变,但是可以新增字段

    1.修改表名称

    ALTER TABLE 旧表名 RENAME TO 新表名 

    eg: ALTER TABLE or_sql_table RENAME TO new_table;

     

    2.添加字段

    ALTER TABLE 表名 ADD COLUMN 列名 数据类型 

    ALTER TABLE 'IPC_FGUID' ADD 'iPassageway' VARCHAR(100) DEFAULT 0;

    3.查询表结构

    PRAGMA TABLE_INFO (表名)

    eg: PRAGMA TABLE_INFO (new_table);

     

    4.修改表结构字段类型

    SQLite 仅仅支持 ALTER TABLE 语句的一部分功能,我们可以用 ALTER TABLE 语句来更改一个表的名字,也可向表中增加一个字段(列),但是我们不能删除一个已经存在的字段,或者更改一个已经存在的字段的名称、数据类型、限定符等等。 

    而修改一列无法像其他数据库那样直接以“ALTER TABLE 表名 ADD COLUMN 列名 数据类型”的方式来完成,所以要换种思路,具体步骤看下面:

    1. --1.将表名改为临时表

    ALTER TABLE "Student" RENAME TO "_Student_old";

    1. 2

    --2.创建新表

    CREATE TABLE "Student" ("Id"  INTEGER PRIMARY KEY AUTOINCREMENT, "Name"  Text);

    1. 3

    --3.导入数据

    INSERT INTO "Student" ("Id", "Name") SELECT "Id", "Title" FROM "_Student_old";

    1. 4

    --4.更新sqlite_sequence

    UPDATE "sqlite_sequence" SET seq = 3 WHERE name = 'Student';

    由于在Sqlite中使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,所以要一起更新下。如果有没有设置自增长,则跳过此步骤。

    1. 5

    --5.删除临时表(可选)

    DROP TABLE _Student_old;

    展开全文
  • 金仓数据库新增字段

    千次阅读 2020-07-29 00:30:01
    情形:金仓数据库中存在数据,但是想添加一个新的字段 解决方法: 1、建表的时候,留备用的字段可以使用,只是字段名不是想要的那个名,例如,reserved1 2、通过程序导出所有记录的insert语句,这上面进行...
  • 表中新增了一些记录,但某些字段的值为Null,需要同表中字段值不为空的记录里面去取得值。 结构如下 表名:MyTable 字段:ID, NameCn, NameEn 由于新增了一些记录,只有NameEn值,NameCn为Null,需要...
  • ALTER TABLE table_name ADD COLUMN id int(11) NOT NULL AUTO_INCREMENT first,ADD primary KEY(id); 执行完后,会原有的表的第一列添加自增主键,以1开始
  • 大表新增字段

    千次阅读 2013-10-23 13:57:52
    一个业务繁忙并且数据量巨大的环境中,新增一个字段对于DBA来说都是一个不简单的任务 ALTER_XHL 表记录8000W 行,与之有关的并发业务量非常大,新增default值的字段 ALTER TABLE ALTER_XHL ADD ( DDD NUMBER...
  • Django新增记录数据验证

    千次阅读 2018-12-03 10:01:41
    Django新增记录数据验证 还请大家多多交流指正 关于Django新增一条记录并对数据验证的方式,官方文档上是说数据验证分为三步分别为 Model.clean_fields() Model.clean() Model.validate_unique() 其中...
  • 我添加ID列之后,需要从1开始递增把已有数据行的ID字段填充,才可以设置为自增长的主键。 不说了,上SQL语句块 DECLARE @i int SET @i=0 UPDATE table1 SET @i=@i+1,ID=@i 当然,用游标也是可以的,那就有些...
  • 已经插入数据后新建字段,报错的话,删除之前的迁移记录(如果是公司数据库请谨慎操作,本方法仅用于开发环境),途中迁移记录即002和003 (例)再models表中新建crate_time字段,然后mange.py中执行...
  • 用ibatis和mysql,用excel导入表格A时, A表一个字段a每月还款额,B表一个字段b总金额。...A表插入一行新的数据,对应的B表的 某条数据字段b总金额发生更新变化。 请问Action中或sql语句要如何实现这个功能
  • 新增记录是可以入库的,没有问题,可发现flag字段却为null,略思考下,原来是实体中对flag进行了getter、setter, 结果框架的新增方法(cultureactGzlManager.saveNewObject(msg);)保存实体的时候把null保存进了...
  • 看起来有些奇怪,因为若字段允许NULL,其默认值就是NULL,不用显示声明,可以创建一个无DEFAULT NULL的新增字段再查看desc表结构,就可以证明这点。基于这问题,引申出的NOT NULL字段问题还有不少,也是比较容易忽视...
  • 已有大量数据的表加字段的方法

    千次阅读 2011-11-15 14:51:16
    如果一个表中大量的数据库,增加字段或增加字段长度,经常会弹出以下错误"超时时间到,无法修改表" 用以下方法可解决问题: --增加字段 alter table 表名 add 字段 字段类型 例如:  use ASE_order ...
  • Mysql新增字段到大数据表导致锁表

    万次阅读 2018-06-15 17:14:47
    昨天晚上7点左右,对一张表进行加字段,大概200多万条记录字段90多个的大表,结果造成mysql锁表,进而导致服务不可用。执行语句如下:[sql] view plain copyALTER TABLE `sc_stockout_order` ADD `route_...
  • Sqlite升级时向已有表中增加字段

    千次阅读 2018-09-10 10:01:51
    一般来说,给已有表中增加字段是数据库操作中的基操,没必要再专门写篇blog记录的,但是sqlite对SQL语句支持的不够彻底,比方说这次我们用到的”ALTER TABLE”命令。官方介绍的第一句如下所示: SQLite supports ...
  • 背景需求: * 比如我们这样一个需求,两个excel中的数据,需要插入到数据库中,这个两个excel中的数据有些字段都是一样的,比如本例所写的,电台名称是一样的,省市县也是一样的,而不一样的是波段是调频(FM) 调...
  • 比如表ABC,现有字段x, y,且表中已经许多行记录。现在要添加z字段,且z非null、外键。 这种情况下,只加字段z可以,但还要z非null、是外键,硬来不行,应该这样做: 1,添加新字段z,先将其设置为...
  • 1.如何创建一个数据表格就不说了,官网已有很详细的介绍。 2. 数据表格建好后,js代码中不写url,因为我想让它实现的功能是人为输入数据并显示。 3.页面新增的功能中添加一个空数组,并将数据表格里的字段数据...
  •   二、 1、检查此表是否被其它对象引用,如果引用对象过多且并发操作多,则此操作一定要避免业务高峰期操作,如果引用量特别多且相应对象并发操作多,则可能要考虑短暂停止此表及相关引用对象...
  • 主键冲突,在有的表中,使用的是业务主键(字段有业务含义),但是往往进行数据插入的时候,又不确定数据表中是否已经存在对应的主键 解决方案: 1、主键冲突更新 类似插入语法,如果插入过程中主键...
  • 在新增字段的时候,所谓的新增字段没有默认值,所以会被系统提示无法添加,这时候,需要先增加一列可空字段,然后修改可空字段的所有值,直到没有空字段为止,然后打开设计器或者编写脚本,将该列修改为非空。...
  • 首先说下应用场景,客户方两套人力资源管理系统,xi
  • 最近工作中碰到一个问题: 需要往一个表里批量添加或者修改数据,这些数据记录里面一个字段的值是唯一且不变的,当被插入表中存在该字段的某个值,且待插入数据中对应字段该值,那么对被插入表做更新操作,...
  • 由于最近比较忙,没有及时更新博客,今天继续前边,记录一下tableau的学习过程。...连接后,数据字段将显示工作簿左侧的数据窗口中。 2.1基本连接 支持的数据源 Tableau 支持各种数据源,包括 Micro
  • 表增加了一个字段,定义是基本类型默认值,新生成的数据没问题但是历史数据字段都是空值,导致程序会出错,JavaBean中的字段类型double和数据库中的空值不匹配,本来想get和set中做点文章,返回一个默认值,...
  • 记录一次mysql导入导出数据过程

    千次阅读 2019-06-12 11:00:45
    本文包含知识点: 1、mysql数据库给大表增加字段;...事件原由:线上版本迭代的过程中,根据新需求需要对表进行增减字段、重新分区,表数据达到一定量(600W左右),占用磁盘100多G,表结构如下: CREATE TABLE `ne...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,881
精华内容 21,552
关键字:

如何在已有记录新增字段数据