SQL学习十四、创建和操纵表

多数 DBMS都具有交互式创建和管理数据库表的工具,表也可以直接用 SQL语句操纵。这里我主要结合移动端数据库SQLite 来讲解相关的表操作。

SQLite 的操作方式可以看做是一种更简单的文件操作方式。


SQL

创建表

对于不同的 DBMS,要编写不同的表创建脚本,因为有些DBMS数据类型的支持不一样。

  • 建表,允许为Null 和不允许为Null的字段
CREATE TABLE `oderlist_new` (
	`id`	INTEGER NOT NULL,
	`goodsName`	TEXT,
	`quantity`	integer,
	`item_price`	real,
	`orderNo`	text,
	`userId`	INTEGER,
	`userName`	TEXT,
	`orderTime`	TEXT,
	`supplierId`	INTEGER,
	PRIMARY KEY(`id`)
);
  • 建表的时候指定默认值
CREATE TABLE `oderlist_new` (
	`id`	INTEGER NOT NULL,
	`goodsName`	TEXT,
	`quantity`	integer default 1,
	`item_price`	real,
	`orderNo`	text,
	`userId`	INTEGER,
	`userName`	TEXT,
	`orderTime`	TEXT,
	`supplierId`	INTEGER,
	PRIMARY KEY(`id`)
);

更新表

1、应该尽量避免在表中包含数据时对其进行更新,而应该在表的设计过程中充分考虑未来可能的需求,避免今后对表的结构做大改动;
2、可以新增字段,但是不要删除和修改字段。

ALTER TABLE 表名
ADD 字段 字段类型(字段长度限制)
  • 对新的订单表增加一个supplierName字段,长度设为255
alter table oderlist_new
add supplierName text(255)

执行结果

注意:
使用 ALTER TABLE 要极为小心,应该在进行改动前做完整的备份(表 结构和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的 列,也许无法删除它们。类似地,如果删除了不应该删除的列,可能 会丢失该列中的所有数据。


删除表

DROP TABLE 表名 
  • 删除刚才创建的订单表
DROP TABLE oderlist_new

执行结果

  • 批量删除表

先查出所有表的名称 SELECT name FROM sqlite_master WHERE type='table' ORDER BY name

然后循环删除


重命名表

每个 DBMS对表重命名的支持有所不同。
DB2、MariaDB、MySQL、Oracle和 PostgreSQL用户使用 RENAME 语句;
SQL Server用户使用sp_rename 存储过程;
SQLite用户使用 ALTER TABLE 语句。

ALTER TABLE database_name.table_name RENAME TO new_table_name;

SQLite in Android

SQLiteDatabase

  • 创建或打开数据库
    https://developer.android.google.cn/reference/android/database/sqlite/SQLiteDatabase
        //1、SQLiteDatabase 数据库对象的操作
        //创建或打开数据库
        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase();
        //打开数据库
        SQLiteDatabase.openDatabase();
        //执行SQL,没有返回值
        db.execSQL();
        //插入数据
        db.insert();
        //更新数据
        db.update();
        //删除数据
        db.delete();
        //查询
        Cursor cursor = db.query();
        Cursor rawCursor = db.rawQuery();
        //开启事务
        db.beginTransaction();
        //结束事务
        db.endTransaction();
        //当前上下文是否处于事务中
        db.inTransaction();

        //2、Cursor 游标对象的操作
        //游标的移动,正数向下移动,负数向上移动
        cursor.move();
        //移动到第一行
        cursor.moveToFirst();
        //移动到最后一行
        cursor.moveToLast();
        //移动到下一行
        cursor.moveToNext();
        //移动到上一行
        cursor.moveToPrevious();
        //移动到指定行
        cursor.moveToPosition();
        //游标移动到对应行之后,就可以通过游标实体的get方法去获取对应列的值了

SQLiteOpenHelper

https://developer.android.google.cn/reference/android/database/sqlite/SQLiteOpenHelper

用于创建、升级、打开SQLiteDatabase

        //3、SQLiteOpenHelper 管理数据库的工具类
        SQLiteOpenHelper helper = new MySQLiteOpenHelper();
        //以读写的方式打开数据库
        SQLiteDatabase readableDatabase = helper.getReadableDatabase();
        //以写的方式打开数据库
        SQLiteDatabase writableDatabase = helper.getWritableDatabase();
        //关闭打开的SQLite数据库
        helper.close();
...

    /**
     * 1、实际项目中很少使用SQLiteDatabase的方法来打开数据库
     * 2、一般都是继承SQLiteOpenHelper类,来管理SQLiteDatabase
     * 3、通过SQLiteOpenHelper来获取SQLiteDatabase实例来进行相关数据库操作
     */
    private class MySQLiteOpenHelper extends SQLiteOpenHelper{

        public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            //初次生成数据库时的回调
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            //数据库版本发生改变时的回调

        }
    }

版权声明:本文为m0_37168878原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。