sqlite怎么给原有的表增加外键

sqlite怎么给原有的表增加外键,第1张

-- 创建测试主表. ID 是主键.

CREATE TABLE test_main (

id INT NOT NULL,

value VARCHAR(10),

PRIMARY KEY(id)

)

-- 插入测试主表数据.

INSERT INTO test_main(id, value) VALUES (1, 'ONE')

INSERT INTO test_main(id, value) VALUES (2, 'TWO')

-- 创建测试子表. ( 注意, 这里要有一个 ON DELETE CASCADE )

CREATE TABLE test_sub (

id INT PRIMARY KEY,

main_id INT REFERENCES test_main(id) ON DELETE CASCADE,

value VARCHAR(10)

)

-- 插入测试子表数据.

INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE')

INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO')

-- 测试删除主表.

sqlite>DELETE FROM test_main WHERE id = 1

-- 查看 子表数据是否被删除.

sqlite>select * from test_sub

2|2|TWOTWO

介绍:

安卓默认的数据是SQLite,但SQLite3.6.19之前是不支持外键的,如果有两张表需要关联,用外键是最省事的,但不支持的话怎么办呢?这里就有一个解决办法,就是用事务将两张表关联起来,并且最后生成一张视图

现有两张表

Employees

Dept

视图

ViewEmps:显示雇员信息和他所在的部门

创建数据库

自定义一个辅助类继承SQLiteOpenHelper类

1.onCreate(SQLiteDatabase db): 当数据库被创建的时候,能够生成表,并创建视图跟触发器

2.onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): 更新的时候可以删除表和创建新的表。

代码如下:view plain

public class DatabaseHelper extends SQLiteOpenHelper {  

  

static final String dbName="demoDB"  

static final String employeeTable="Employees"  

static final String colID="EmployeeID"  

static final String colName="EmployeeName"  

static final String colAge="Age"  

static final String colDept="Dept"  

  

static final String deptTable="Dept"  

static final String colDeptID="DeptID"  

static final String colDeptName="DeptName"  

  

static final String viewEmps="ViewEmps"

构造器

public DatabaseHelper(Context context) {  

  super(context, dbName, null,33)   

  }

创建库中的表,视图和触发器

public void onCreate(SQLiteDatabase db) {  

  // TODO Auto-generated method stub  

    

  db.execSQL("CREATE TABLE "+deptTable+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+  

    colDeptName+ " TEXT)")  

    

  db.execSQL("CREATE TABLE "+employeeTable+"   

    ("+colID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+  

        colName+" TEXT, "+colAge+" Integer, "+colDept+"   

    INTEGER NOT NULL ,FOREIGN KEY ("+colDept+") REFERENCES   

    "+deptTable+" ("+colDeptID+"))")  

    

  //创建触发器  

  db.execSQL("CREATE TRIGGER fk_empdept_deptid " +  

    " BEFORE INSERT "+  

    " ON "+employeeTable+  

      

    " FOR EACH ROW BEGIN"+  

    " SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+deptTable+"   

    WHERE "+colDeptID+"=new."+colDept+" ) IS NULL)"+  

    " THEN RAISE (ABORT,'Foreign Key Violation') END"+  

    "  END")  

  

//创建视图  

  db.execSQL("CREATE VIEW "+viewEmps+  

    " AS SELECT "+employeeTable+"."+colID+" AS _id,"+  

    " "+employeeTable+"."+colName+","+  

    " "+employeeTable+"."+colAge+","+  

    " "+deptTable+"."+colDeptName+""+  

    " FROM "+employeeTable+" JOIN "+deptTable+  

    " ON "+employeeTable+"."+colDept+" ="+deptTable+"."+colDeptID  

    )  

}

更新库中的表

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  

  // TODO Auto-generated method stub  

    

  db.execSQL("DROP TABLE IF EXISTS "+employeeTable)  

  db.execSQL("DROP TABLE IF EXISTS "+deptTable)  

  

  db.execSQL("DROP TRIGGER IF EXISTS fk_empdept_deptid")  

  db.execSQL("DROP VIEW IF EXISTS "+viewEmps)  

  onCreate(db)  

}

加入数据

SQLiteDatabase db=this.getWritableDatabase()  

ContentValues cv=new ContentValues()  

   cv.put(colDeptID, 1)  

   cv.put(colDeptName, "Sales")  

   db.insert(deptTable, colDeptID, cv)  

  

   cv.put(colDeptID, 2)  

   cv.put(colDeptName, "IT")  

   db.insert(deptTable, colDeptID, cv)  

                     db.close()

为数据库表添加外键方法(以SqlSever2005数据库为例):

1、新建两张表,一张为主表,一张为副表。主表里的外键就是连接到副表的主键。

2、首先在主表中添加一个外键字段,如下:

3、在主表上右击,选择关系,如下:

4、点击“添加”。

5、再点击上图中标出的位置,如下:

6、图中标出的“主键表”就选择上面的副表。如下:

7、主键表底下的就选择副表的主键,如下:

8、外键表底下的就选择刚才新建的外键字段。如下:

9、再点击“确定”。

10、点击“是”,即可完成外键的添加。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11767548.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存