精华内容
下载资源
问答
  • MySQL大表增加字段

    2020-07-11 17:39:53
    增加字段的情况下, 如果可以通过增加一个新的来增加这个字段, 那么就增加一个新的, 通过cache 或 程序来实现join 的效果 如果能停机, 并且停机的时间在你容忍范围之内, 数据备份之后停机来做。 如果是...
    1. 能不加字段就不要加, 能不修改字段就不要修改, 能不删除字段就不要删除, 等等为什么要删除字段呢? 如果没事,不要蛋疼的找事。 实际上,我们那次更新失败后, 我们并没有增加那个字段, 然后我们一直运行到今天, 但是后来还是增加了其他字段

    2. 增加字段的情况下, 如果可以通过增加一个新的表来增加这个字段, 那么就增加一个新的表, 通过cache 或 程序来实现join 的效果

    3. 如果能停机, 并且停机的时间在你容忍范围之内, 数据备份之后停机来做。 如果是主从备份,做这样大的操作的时候,停掉主从备份, 万一你挂了, 备份数据库可以救你。 等到一切安全了, 重启主从备份;

    4. 如果上面都不行, 这个字段还是要改,要加, 需要用到下面的方法, 也是扇贝网正在使用的方法;

    修改大数据表的方法:

    1. 被修改的表 Table A 需要有一个记录时间戳的字段, 这个时间戳就是每次数据更新,都会更新的字段, 这个字段需要有索引,在django里可以使用 auto_now=True

    2. 创建一个新的临时表 Table B, 不是tmp_table, 是一个新的表,但是是临时使用的。 这个表和要修改的表拥有一模一样的数据结构, 加上你要修改的部分, 比如增加的字段;

    3. 记录下Table A 的索引

    4. 删除 Table B 的全部索引

    5. 把Table A 的数据全部复制到Table B, 是不是执行 INSERT INTO B(field1, field2) SELECT field1, field2 FROM A? 当然不是, 这么做不还是锁死了Table A 么, 这里的迁移就是一个需要细分的地方,需要写一个脚本, 让程序每次读取比如5000条数据出来, 插入到Table B里面, 因为Table B 是没有索引的, 所以要当心不要使用多进程来做; 如果是多进程, 要确保插入到B的时候是不会有重复数据的; 如果是1000万的数据,每次5000条, 假设这个操作需要500ms, 那么 2000*200ms = 16 分钟。 这只是一个估值, 具体情况和服务器当时的情况有关, 不好细说。 另外, 我们要记录这个迁移开始的时间点,记为t1;

    6. 那么这个时候Table A 的数据是不是都进入了Table B 呢, 应当说差不多大部分都进入了, 但5中说, 这大概需要16分钟, 这么长的时间里, 可能有新的数据进入了, 也有可能已有的数据发生了更新, 所以我们要把Table A 中在t1 之后发生变化的数据查找出来, 然后更新到Table B 中, 我们的做法是:

    记录这个操作对应的时间点 t2
    BEGIN;
    DELETE FROM B WHERE updated_time > t1;
    INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t1;
    COMMIT;

    1. 现在A 和 B 差不多该同步了吧? 差不多了, 但是6 执行完之后, A仍然在写, 子子孙孙无穷尽也 … , 但这个时候 A 和 B 的差异已经非常非常小了, 所以在下一步,我们在一个transaction 里执行下面的操作:

    BEGIN;
    DELETE FROM B WHERE updated_time > t2;
    INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t2;

    ALTER TABLE A RENAME TO C;
    ALTER TABLE B RENAME TO A;
    COMMIT;

    1. Done

    PS: 如果A表没有时间戳, 实际上没有先见之明的人大概不会想到要预留一个时间戳的字段, 那么几乎是没有办法快速比较两个表的差异的, 这个时候我选择的做法就是放弃修改的数据, 只管新的数据了, 所以只要把t1, t2 换成id 就可以了, 这样delete 语句也省略了, 因为没啥好delete的;

    千万不要想着根据ID 来JOIN 然后更新B表的字段来补齐新的数据, 如果能把两个千万级别的表JOIN起来, 内存有多大呢?

    1. 上面的解决方案是我们第二次尝试之后犯下了一个巨大的错误,这个错误导致网站瘫痪了大概20分钟, 如果你和我一样没有发现问题,那么这就是悲剧的地方。 问题就在于我是根据上面的PS来操作的, 然后B就华丽地变成了A. B 表至今身上是没有索引的, 立即悲剧。 所以应当在第5步之后按照A的索引为B建立索引, 待索引全部好了之后, 再继续6。 如果不是走PS这条路, 而是有时间戳的字段的话, 在6的时候会发现这个问题, 因为那条Delete 慢的超出想像, 会明白这里是有问题的

    转载:https://zhidao.baidu.com/question/917987491401145099.html

    展开全文
  • 2. 增加字段的情况下, 如果可以通过增加一个新的来增加这个字段, 那么就增加一个新的, 通过cache 或 程序来实现join 的效果 3. 如果能停机, 并且停机的时间在你容忍范围之内, 数据备份之后停机来做。 如果...
    1. 能不加字段就不要加, 能不修改字段就不要修改, 能不删除字段就不要删除, 等等为什么要删除字段呢? 如果没事,不要蛋疼的找事。 实际上,我们那次更新失败后, 我们并没有增加那个字段, 然后我们一直运行到今天, 但是后来还是增加了其他字段
    
    2. 增加字段的情况下, 如果可以通过增加一个新的表来增加这个字段, 那么就增加一个新的表, 通过cache 或 程序来实现join 的效果
    
    3. 如果能停机, 并且停机的时间在你容忍范围之内, 数据备份之后停机来做。 如果是主从备份,做这样大的操作的时候,停掉主从备份, 万一你挂了, 备份数据库可以救你。 等到一切安全了, 重启主从备份;
    
    4. 如果上面都不行, 这个字段还是要改,要加, 需要用到下面的方法, 也是扇贝网正在使用的方法;
    
    修改大数据表的方法: 
    
    1. 被修改的表 Table A 需要有一个记录时间戳的字段, 这个时间戳就是每次数据更新,都会更新的字段, 这个字段需要有索引,在django里可以使用 auto_now=True
    
    2. 创建一个新的临时表 Table B, 不是tmp_table, 是一个新的表,但是是临时使用的。 这个表和要修改的表拥有一模一样的数据结构, 加上你要修改的部分, 比如增加的字段;
    
    3. 记录下Table A 的索引
    
    4. 删除 Table B 的全部索引
    
    5. 把Table A 的数据全部复制到Table B, 是不是执行 INSERT INTO B(field1, field2) SELECT field1, field2 FROM A? 当然不是, 这么做不还是锁死了Table A 么, 这里的迁移就是一个需要细分的地方,需要写一个脚本, 让程序每次读取比如5000条数据出来, 插入到Table B里面, 因为Table B 是没有索引的, 所以要当心不要使用多进程来做; 如果是多进程, 要确保插入到B的时候是不会有重复数据的; 如果是1000万的数据,每次5000条, 假设这个操作需要500ms, 那么 2000*200ms = 16 分钟。 这只是一个估值, 具体情况和服务器当时的情况有关, 不好细说。 另外, 我们要记录这个迁移开始的时间点,记为t1;
    
    6. 那么这个时候Table A 的数据是不是都进入了Table B 呢, 应当说差不多大部分都进入了, 但5中说, 这大概需要16分钟, 这么长的时间里, 可能有新的数据进入了, 也有可能已有的数据发生了更新, 所以我们要把Table A 中在t1 之后发生变化的数据查找出来, 然后更新到Table B 中, 我们的做法是:
    
    记录这个操作对应的时间点 t2
    BEGIN;
    DELETE FROM B WHERE updated_time > t1;
    INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t1;
    COMMIT;
    
    7. 现在A 和 B 差不多该同步了吧? 差不多了, 但是6 执行完之后, A仍然在写, 子子孙孙无穷尽也 ... , 但这个时候 A 和 B 的差异已经非常非常小了, 所以在下一步,我们在一个transaction 里执行下面的操作:
    
    BEGIN;
    DELETE FROM B WHERE updated_time > t2;
    INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t2;
    
    ALTER TABLE A RENAME TO C;
    ALTER TABLE B RENAME TO A;
    COMMIT;
    
    8. Done
    
    PS: 如果A表没有时间戳, 实际上没有先见之明的人大概不会想到要预留一个时间戳的字段, 那么几乎是没有办法快速比较两个表的差异的, 这个时候我选择的做法就是放弃修改的数据, 只管新的数据了, 所以只要把t1, t2 换成id 就可以了, 这样delete 语句也省略了, 因为没啥好delete的;
    
    千万不要想着根据ID 来JOIN 然后更新B表的字段来补齐新的数据, 如果能把两个千万级别的表JOIN起来, 内存有多大呢?
    
    9. 上面的解决方案是我们第二次尝试之后犯下了一个巨大的错误,这个错误导致网站瘫痪了大概20分钟, 如果你和我一样没有发现问题,那么这就是悲剧的地方。 问题就在于我是根据上面的PS来操作的, 然后B就华丽地变成了A. B 表至今身上是没有索引的, 立即悲剧。 所以应当在第5步之后按照A的索引为B建立索引, 待索引全部好了之后, 再继续6。 如果不是走PS这条路, 而是有时间戳的字段的话, 在6的时候会发现这个问题, 因为那条Delete 慢的超出想像, 会明白这里是有问题的
    
    10. 新手, 请在本地练习之后, 再实际操作; 可以多操作几次, 写一个脚本,服务器上直接执行脚本.
    展开全文
  • 1.sql语句:SELECT * from sqlite_master where name = '表名' and sql like '%字段名%'//查询中有无要添加字段 :alter table 表名 add column 字段 INTEGER default 1//在的结尾添加字段 2.demon节选 int ...

    sqlite_master结构
    1.sql语句:SELECT * from sqlite_master where name = '表名' and sql like '%字段名%'//查询表中有无要添加的字段
    alter table 表名 add column 字段 INTEGER default 1//在表的结尾添加新字段
    2.demon节选

    int sql_exec(sqlite3 *db, const char *sql)
    {
    	int res;
    	sqlite3_stmt *stmt = NULL;
    
    	if ((NULL == db) || (NULL == sql)) {
    		printf("param_error");
    		return -1;
    	}
    
    	
    
    	if (!stmt) {
    		
    		res = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    
    		if (SQLITE_OK != res) {
    			goto out;
    		}
    	}
    
    	/*遍历select执行的返回结果
    	**/
    	res = sqlite3_step(stmt);
    
    	if ((SQLITE_ROW == res)) {
    		return 0;
    	}
    
    out:
    
    	if ((res != SQLITE_DONE) && (res != SQLITE_OK)) {
    		const char *err = sqlite3_errmsg(db);
    
    		if (err) {
    			printf("%s", err);
    		}
    	}
    
    	sqlite3_finalize(stmt);
    	return 1;
    }
    
    int class_table_confirm(sqlite3 *db, const char *sql)
    {
    	int res;
    	sqlite3_stmt *stmt = NULL;
    
    	res = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    
    	if (res != SQLITE_OK) {
    		goto out;
    	}
    
    	res = sqlite3_step(stmt);
    
    	if (res == SQLITE_ROW) {
    		sqlite3_finalize(stmt);
    		return 0;
    	}
    
    out:
    
    	if (res != SQLITE_DONE && res != SQLITE_OK) {
    		printf("%s", sqlite3_errmsg(db));
    	}
    
    	if (stmt) {
    		sqlite3_finalize(stmt);
    	}
    
    	return 1;
    }
    
    //检查数据库中的某张表中的某个字段是否存在,不存在添加
    void _check_column(sqlite3 *db)
    {
    	int ret;
    	char *errmsg = NULL;
    
    	char *tmp =" SELECT * from sqlite_master where name = 'class' and sql like '%sex%' ";
    	
    	ret = class_table_confirm(db, tmp);
        
    	if (0 != ret) {
    		tmp = "alter table class add column sex INTEGER default 1";
    		sql_exec(db, tmp);
    	}
    }
    

    完整可运行demon
    在class表中添加sex字段

    #include <stdio.h>
    #include <sqlite3.h>
    #include <string.h>
    #include <errno.h>
    
    /***********sql 语句**************************/
    #define CREATE_SCOOL_TABLE \
        "CREATE TABLE IF NOT EXISTS SCHOOL(students_number  INTEGER DEFAULT 0,grade  INTEGER DEFAULT 0)"
    #define CREATE_CLASS_TABLE \
        "CREATE TABLE IF NOT EXISTS class(student_name DEFAULT NULL,age INTEGER DEFAULT 0)"
    
    #define INSERT_class "INSERT or IGNORE INTO  class(age,student_name,sex) VALUES (?,?,?)"
    
    #define EMPTY_STUDENT "DELETE FROM class"
    
    /***********sql 语句**************************/
    
    
    
    #define DB_PATH "./SQL.db"
    static sqlite3 *db;
    
    
    int sql_exec(sqlite3 *db, const char *sql)
    {
    	int res;
    	sqlite3_stmt *stmt = NULL;
    
    	if ((NULL == db) || (NULL == sql)) {
    		printf("param_error");
    		return -1;
    	}
    
    	
    
    	if (!stmt) {
    		
    		res = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    
    		if (SQLITE_OK != res) {
    			goto out;
    		}
    	}
    
    	/*遍历select执行的返回结果
    	**/
    	res = sqlite3_step(stmt);
    
    	if ((SQLITE_ROW == res)) {
    		return 0;
    	}
    
    out:
    
    	if ((res != SQLITE_DONE) && (res != SQLITE_OK)) {
    		const char *err = sqlite3_errmsg(db);
    
    		if (err) {
    			printf("%s", err);
    		}
    	}
    
    	sqlite3_finalize(stmt);
    	return 1;
    }
    
     void sql_create_table(db)
    {	
    	sql_exec(db, EMPTY_STUDENT);
    	sql_exec(db, CREATE_SCOOL_TABLE);
    	sql_exec(db, CREATE_CLASS_TABLE);
    
    }
    
    void sql_class_insert(int age,const char *name,const char *sex)
    {
    	int res, err = -1;
    	sqlite3_stmt *stmt;
    	
    	//1.执行sql select语句
    	res = sqlite3_prepare_v2(db, INSERT_class, -1, &stmt, NULL);
    
    	if (SQLITE_OK != res) {
    		goto out;
    	}
    
    	//2.绑定数据 int类型
    	res = sqlite3_bind_int(stmt, 1, age);
        if (res != SQLITE_OK) 
       	{
    		goto out_free;   
        }
    
    	//2.绑定数据 字符型
    	//SQLITE_STATIC->传递给该字符串的指针将有效,直到执行查询为止
    	res = sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC); 
        if (res != SQLITE_OK) 
    	{
    		goto out_free;
        }
    
    	res = sqlite3_bind_text(stmt, 3, sex, -1, SQLITE_STATIC); 
        if (res != SQLITE_OK) 
    	{
    		goto out_free;
        }
    	
    	//3.遍历select执行的返回结果
    	res = sqlite3_step(stmt);
    
    	if (SQLITE_DONE == res) {
    		err = 0;
    	}
    out_free:
    	//4.销毁前面被sqlite3_prepare创建的准备语句
    	//【每个准备语句都必须使用这个函数去销毁以防止内存泄露】
    	sqlite3_finalize(stmt);
    out:
    
    	if (err < 0) {
    		printf("%s\n", sqlite3_errmsg(db));
    		printf( "res = %d\n", res);
    	}
    }
    
    
    int class_table_confirm(sqlite3 *db, const char *sql)
    {
    	int res;
    	sqlite3_stmt *stmt = NULL;
    
    	res = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    
    	if (res != SQLITE_OK) {
    		goto out;
    	}
    
    	res = sqlite3_step(stmt);
    
    	if (res == SQLITE_ROW) {
    		sqlite3_finalize(stmt);
    		return 0;
    	}
    
    out:
    
    	if (res != SQLITE_DONE && res != SQLITE_OK) {
    		printf("%s", sqlite3_errmsg(db));
    	}
    
    	if (stmt) {
    		sqlite3_finalize(stmt);
    	}
    
    	return 1;
    }
    
    //检查数据库中的某张表中的某个字段是否存在,不存在添加
    void _check_column(sqlite3 *db)
    {
    	int ret;
    	char *errmsg = NULL;
    
    	char *tmp =" SELECT * from sqlite_master where name = 'class' and sql like '%sex%' ";
    	
    	ret = class_table_confirm(db, tmp);
        
    	if (0 != ret) {
    		tmp = "alter table class add column sex INTEGER default 1";
    		sql_exec(db, tmp);
    	}
    }
    
     int sqlite_init(const char *db_path)
    {
    	int ret;
    
    	if (NULL == db_path) {
    		perror("sqlite_init  error");
    		return -1;
    	}
    
    	//判断是否启用串行模式
    	if (sqlite3_threadsafe() != 1) {
    		ret = sqlite3_config(SQLITE_CONFIG_SERIALIZED);//设置为串行模式
    
    		if (ret != SQLITE_OK) {
    			printf("SQLite3 is not compiled with serialized threading mode!\n");
    			return -1;
    		}
    	}
    
    	//sqlite初始化
    	ret = sqlite3_initialize();
    	if (ret != SQLITE_OK) {
    		perror("database_init sqlite_initalize error");
    		return -1;;
    	}
    
    	ret = sqlite3_open(db_path,&db);
    	if (ret) {
    		printf("Can't open sql: %s", sqlite3_errmsg(db));
    		return -1;
    	}
    	
    	sql_create_table(db);
    	
    	_check_column(db);
    	
    	return 0;
     }
    
    int main()
    {
    	sqlite_init(DB_PATH);
    	sql_class_insert(18,"张三","男");
    	
    	
    	return 0;
    }
    
    

    运行结果
    在这里插入图片描述

    展开全文
  • 只是会混淆新手,如果你的应用程序需要更多的内存,他们会回收一部分用作磁盘数据缓存的物理内存,返回给应用程序,这个过程不需要启动交换磁盘缓存(Disk caching)是不能禁用的 –为了增加数据交换速度内存占用率 ...

    in theory

    Linux会借用空闲的内存当作磁盘缓存, 磁盘数据缓存会让linux运行的更快,它永远不会从程序中拿出内存。

    它没有任何缺点,只是会混淆新手,如果你的应用程序需要更多的内存,他们会回收一部分用作磁盘数据缓存的物理内存,返回给应用程序,这个过程不需要启动交换

    磁盘缓存(Disk caching)是不能禁用的 –为了增加数据交换速度

    内存占用率 = total/ (total - (used + free + buffer + cache))

    for example


    如果真要和windows比,其剩余的内存大小为 +buffers/cache = 685544kb (680m左右)
    程序使用内存大小 330m左右,而不是 使用了 900M 剩余100M

    buffer里 73m用作块设备做缓存(记录文件系统的metadata和tracking in flight pages )
    cached 里 510m 用作缓存文件

    buffer和cached 随时都可以腾出空间 给程序使用

    内存字段介绍

    buffer 用于存放要输出到磁盘的数据
    cache是从磁盘读出存放到内存中待今后使用的数据。它们的引入均是为了提供IO的性能。
    shared 为进程间共享的内存

      内存:从用户和操作系统的角度来看,其大小空间是有区别的。像buffer/cached的内存,由于这块内存从操作系统的角度确实被使用,但如果用户要使用,这块内存是可以很快被回收而被用户空间程序使用,因此从用户角度而言这块内存应被划为空闲状态。

      为什么Linux 会有这种机制呢?

      其实这是一种非常优秀的设计,目的就是为了提升磁盘IO的性能,从低速的块设备上读取的数据会暂时保存在内存中,即使数据在当时已经不再需要了,但在应用程序下一次访问该数据时,它可以从内存中直接读取,从而绕开低速的块设备,从而提高系统的整体性能。

    展开全文
  • MySQL5.6在线DDL不锁(在线添加字段) 解答你也看一下MySQL5.6在线DDL不锁,现在我有一张1亿的,需要增加一个字段,假如我让你去增加这个字段,你应该注意什么,具体怎么操作? 操作如下:1.注意磁盘空间...
  • MySQL添加字段的方法并不复杂,下面将为您详细介绍MySQL添加字段和修改字段等操作的实现方法,希望对您学习MySQL添加字段方面会有所帮助。 1.登录数据库 >mysql -u root -p 数据库名称 2.查询所有数据 >...
  • MySQL中给一张千万甚至更大量级的表添加字段一直是比较头疼的问题,遇到此情况通常该如果处理?本文通过常见的三种场景进行案例说明。 1、 环境准备 数据库版本: 5.7.25-28(Percona 分支) 服务器配置: 3台centos...
  • Oracle数据库创建ID字段的自动递增 将t_uaer的字段ID设置为自增:(用序列sequence的方法来实现) ----创建Create table t_user( Id number(6),userid varchar2(20),loginpassword varchar2(20),...
  • Delphi内存表的使用

    千次阅读 2017-06-07 12:00:11
     创建好后如果还要添加字段添加字段后需先右键单击控件执行clear data,然后再右键此控件重新点击create data 4、临时的:增删改语法 添加数据到ClientDataset Self.cdsExpenseList.Edit;  Self.
  • Oracle数据库创建ID字段的自动递增

    千次阅读 2011-09-15 18:05:06
    t_uaer的字段ID设置为自增:(用序列sequence的方法来实现) ----创建 Create table t_user( Id number(6),userid varchar2(20),loginpassword varchar2(20),isdisab
  • Delphi : kbmMemTable关于内存表的使用

    千次阅读 2017-06-05 17:57:43
    关于内存表的使用(kbmMemTable) 关于内存表的使用说明 一、 Delphi使用内存表 1.1 Delphi创建内存表步骤: 1. 创建一个Ttable实例。 2. 设置一个DataBaseName为一个目录或是已有的数据库别名。 3. 指定...
  • mysql 的 内存表和临时

    千次阅读 2010-04-28 10:47:00
    2 内存表中不可以使用TEXT和BLOB类型的字段。3 内存表可以通过max_heap_table_size = 2048M来加大使用的内存。 1 临时机构和数据都是放在内存中的 具体见下:内存表使用哈希散列索引把数据保存在内存中,...
  • 在ndb上可以建立两种类型的: ...磁盘:仅主键、索引字段保存在内存中,其他字段保存在磁盘文件里。 1 创建内存表 2 创建磁盘 2.1 创建undo日志文件组 2.2 创建数据空间 2.3 创建磁盘 3 ...
  • Java不少类可以通过Set方法动态向对象添加新的字段内容,这里面如何实现这功能且代码质量较高呢?这里我参照thinking in java的书籍,自定义一个可以在运行时动态的添加字段内容。 //自定义异常 class ...
  • 共享内存表的共享数据必须是不变的,不能对共享内存表进行插入、...2、创建内存表添加需要获取的字段 3、创建查询结果集用来获取数据库数据 4、添加规则,把查询结果集的数
  • delphi 动态添加字段表格控件

    千次阅读 2017-11-16 09:46:38
    在使用delphi有时候会遇到需要生成动态添加字段的报表,要达到这样的效果,需要几个控件配合使用: TFunctionButton MTable MBBDBGrid MDataSource 四者缺一不可,有了这几个控件后需要进行一些设置, MBBDBGrid有...
  • ClientDataSet 使用内存表

    千次阅读 2015-08-15 14:47:36
    1,手动添加字段值  cds1.Close;  cds1.CreateDataSet; cds1..FieldByName('字段1').AsString:='测试';//字段赋值  s:=cds1..FieldByName('字段1').AsString;//字段的获取 2、代码添加字段 ...
  • 关系和参数 字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则...
  • //创建内存表对象 $table=new swoole_table(1024);① //在内存表中定义三列 $table->column('id',\Swoole\Table::TYPE_INT,4);② $table->column('name',\Swoole\Table::TYPE_STRING,12); $table->column...
  • 一、主键约束 1.单字段主键 字段名 数据类型 primary key eg: create table zyf (id int primary ...2.多字段主键 primary key (字段名1,字段名2,字段名3.....,字段名n) eg: create table zyf( id int(10), name...
  • Delphi中TClientDataSet的字段添加 ClientDataSet做内存表导入数据 var aDataSet: TClientDataSet; begin if(aFieldType = ftString) then begin with TStringField.Create(nil) do begin FieldName := ‘Field’+...
  • 关于Delphi内存表的使用说明

    千次阅读 2014-09-18 20:21:31
    关于Delphi内存表的使用说明: 1.建立临时   数据输入是开发数据库程序的必然环节。在Client/Server结构中,客户端可能要输入一批数据后,再向服务器的后台数据库提交,这就需要在本地(客户端)建立临时...
  • 字段表集合。

    千次阅读 2018-04-09 11:26:30
     字段表集合中不会列出从超类或者父接口中继承而来的字段,但有可能列出原本Java代码之中不存在的字段,譬如在内部类中为了保持对外部类的访问性,会自动添加指向外部类实例的字段。另外,在Java语言中字段是无法...
  • 字段表(field_info)用于描述接口或类中声明的变量。字段(field)包括了类级变量或实例变量,但不包括方法内部声明的变量。描述一个字段的信息有:字段的作用域(public,private,protected修饰符),是类级变量还是实例...
  • alter table .. modify .. varcher(n)会不会改变原来的索引,非空约束等?
  • 水晶报表中,因为数据源的字段是不固定的,可否在运行时动态添加字段,就象在winform中动态添加控件一样?(更新:2003-11-05)——————————————————————————————————————解决...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 370,093
精华内容 148,037
关键字:

内存表添加字段