繁体   English   中英

用外键创建表

create tables with foreign key

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我编写了一个创建表的函数:

def createSQLCreateTableCommand(tableName, columns, foreignKeys):
    columns = ["%s"%(c) for c in columns]
    foreignKeys = ["FOREIGN KEY (%s) REFERENCES %s(%s)"%(fk[0],fk[1],fk[2]) for fk in foreignKeys]
    cmd = """CREATE TABLE IF NOT EXISTS %s (%s)"""%(tableName,','.join(columns+foreignKeys))
    return cmd

我想测试我的功能并编写以下代码。 “访问”和“测试”只是带有某些列的表。 在表“ test_result”中,它包含“访问”表中的rowid的外键和“测试”表中的rowid的外键。 我的代码适用于“访问”和“测试”表,但无法演示“ test_result”表。 我不确定不能正确表达外键参数。 有人可以帮助我修复代码吗?

conn = sqlite.connect(":memory:")
cursor = conn.cursor()

sqlVisits = createSQLCreateTableCommand("visit",["visitid text"],[])
sqlTests = createSQLCreateTableCommand("test",["name text","unit text","low text","high text"],[])
sqlTestResults = createSQLCreateTableCommand("test_result",["value text","time_date text"],["visit int","test int"])    #this is not correct

cursor.execute(sqlVisits)
cursor.execute(sqlTests)
cursor.execute(sqlTestResults)
conn.commit()

cursor.execute("""SELECT tbl_name FROM sqlite_master WHERE type = 'table'""")
print cursor.fetchall()
1 个回复

当您打印函数的实际输出时:

>>> createSQLCreateTableCommand("test_result",["value text","time_date text"],["visit int","test int"])
CREATE TABLE IF NOT EXISTS test_result (
    value text,
    time_date text,
    FOREIGN KEY (v) REFERENCES i(s),
    FOREIGN KEY (t) REFERENCES e(s)
)

您会看到类似fk[0]表达式从字符串中提取单个字符。

参数foreignKeys必须是一个由三个字符串组成的数组:子列名称,父表名称和父列名称:

>>> print createSQLCreateTableCommand("test_result",
...                                   ["value text", "time_date text"],
...                                   [("visitid", "visit", "visitid"),
...                                    ("testname", "test", "name")])
CREATE TABLE IF NOT EXISTS test_result (
    value text,
    time_date text,
    FOREIGN KEY (visitid) REFERENCES visit(visitid),
    FOREIGN KEY (testname) REFERENCES test(name)
)

但是,这不是有效的SQL,因为FOREIGN KEY约束必须引用子表中的现有列。

要解决此问题,请更改createSQLCreateTableCommand函数以创建具有外键列约束的列:

>>> def createSQLCreateTableCommand(tableName, columns, foreignKeys):
...     columns = ["%s"%(c) for c in columns]
...     foreignKeys = ["%s REFERENCES %s(%s)"%(fk[0],fk[1],fk[2]) for fk in foreignKeys]
...     cmd = """CREATE TABLE IF NOT EXISTS %s (%s)"""%(tableName,','.join(columns+foreignKeys))
...     return cmd
...
>>> print createSQLCreateTableCommand("test_result",
...                                   ["value text", "time_date text"],
...                                   [("visitid text", "visit", "visitid"),
...                                    ("testname text", "test", "name")])
CREATE TABLE IF NOT EXISTS test_result (
    value text,
    time_date text,
    visitid text REFERENCES visit(visitid),
    testname text REFERENCES test(name)
)
1 如何为2个表创建外键?

假设我销售书籍和CD,所以我在两者中的数据库都有表,因为我不能对两者都使用相同的表。 我也为他们两个都有一个库存表,该表通过外键指向相应项目的表。 像这样: 但是我想有一个普通的库存表,根据type列引用这两个表。 那么,如何使这种约束检查多个表呢? ...

2 创建系统表的外键

我想用列创建表: 我的想法是IdProcedure是sys.objects的FK。 当我创建此查询时: 它工作正常,但这一个: 告诉我: 外键'FK_SysProcedure'引用无效表'sys.objects'。 ...

3 如何为多个表创建外键? [重复]

这个问题已经在这里有了答案: 可以对两个可能的表之一执行MySQL外键吗? 4个答案 我想存储类似于Google云端硬盘的文件结构。 我可以创建几种类型的文件(文档,电子表格,..)。 每个文件的详细信息都存储在其表中。 例如: 怎么做对? ...

6 如何创建两个与外键链接的表

这是我的问题:我正在一个名为David的数据库中工作,在那里我试图创建两个表: colores和productos ,这两个表将通过外键链接,其中父表将为colores ,子表将为productos ,但是当我单击继续时,将显示以下消息: errno:150“外键约束格式不正确” ...

7 无法使用外键创建sqlite表

我正在尝试做一个使用外键通过 sqlite 链接两个表的简单示例。 但是,我不断收到错误消息。 我有两张桌子。 成员, 字符. 一个成员可以有多个字符。 这是架构: CREATE TABLE "member" ( "member_id" TEXT NOT NULL, "platf ...

8 连接外键表

我有以下三个表: 产品 购买(包含ProductID作为外键) 销售(也包含ProductID作为外键) 我想形成连接这3个表的查询,我的结果是产品名称,购买和出售。 Product Name -(来自“产品”表) Purchased -(根据Pro ...

9 3个表上的外键连接

我有一个表TableA,它包含表TableB和TableC的2个不同的外键。 我试图从表TableB获取数据,但取决于表TableC中的值。 有了这个查询,我得到了所有的值,但我不知道如何编写where子句来过滤和获取我需要的数据。 编辑:我的表的图片。 所以我试图显示表B ...

10 给表添加外键

我需要执行以下操作: 选择course_id和userid_DI作为表course_users中的两个不同的外键。 表users有以下内容: userid_DI 、 Country 、 LoE_DI 、 YoB 、 Age 、 gender course表具有以下内容: course_id ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM