【问题标题】:Insert Data Into A Table Using The Same Foreign Key Value使用相同的外键值将数据插入表中
【发布时间】:2016-04-09 16:20:09
【问题描述】:

我正在使用 SQL Server、Python、pypyodbc。 我的表是:

tbl_User: id, owner

tbl_UserPhone: id, number, user_id

user_id 是 User 的主键和 UserPhone 的外键。 我正在尝试使用 pypyodbc 将 2 部不同的手机插入同一个 user_id。 这是我尝试过但不起作用的事情之一:

cursor = connection.cursor()
SQLCommand = ("INSERT INTO tbl_UserPhones"
                    "(id,number,user_id)"
                    " VALUES (?,?,?)")
values = [userphone_index, user_phone,"((SELECT id from tbl_User where id = %d))" % user_id_index]
cursor.execute(SQLCommand, values)
cursor.commit()

【问题讨论】:

  • 你能解释一下did not work吗?你收到错误了吗?需要更多信息
  • 不,它只是跳过了 cursor.commit() 行。它应该工作吗?
  • 如果我是你,我会使用 Python 打印出 SQLCommand,然后尝试将该命令粘贴到 SQL Server 的控制台(如 Management Studio)中以查看错误是什么。我猜这就是您的 tbl_UserPhones 表的定义方式,但如果没有更多信息就不可能知道。
  • 这是我得到的:当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'tbl_UserPhones' 中插入标识列的显式值。
  • edit 澄清您的问题:(1)[tbl_UserPhone].[id] 是该表的 IDENTITY 列,如果是,它也是主键吗? (2) 您是否已经知道要插入到[tbl_UserPhone].[user_id] 列中的[tbl_User].[id] 值?

标签: python sql sql-server pyodbc pypyodbc


【解决方案1】:

根据您的 cmets,您在 tbl_UserPhones 中有一个标识列。根据列名,我猜它是 ID 列。

您得到的异常非常清楚 - 如果在插入语句之前没有专门将 identity_insert 设置为 on,则无法将数据插入标识列。基本上,弄乱身份列是不好的做法。最好让 Sql server 使用它的内置功能并自动处理对标识列的插入。

您需要将插入语句更改为不包含 id 列:

代替

SQLCommand = ("INSERT INTO tbl_UserPhones"
                "(id,number,user_id)"
                " VALUES (?,?,?)")
values = [userphone_index, user_phone,"((SELECT id from tbl_User where id = %d))" % user_id_index]

试试这个:

SQLCommand = ("INSERT INTO tbl_UserPhones"
                "(number,user_id)"
                " VALUES (?,?)")
values = [user_phone,"((SELECT id from tbl_User where id = %d))" % user_id_index]

【讨论】:

    【解决方案2】:
    SQLCommand = ("INSERT INTO tbl_UserPhones"
                    "(id,number,user_id)"
                    " VALUES (?,?,?)")
    user_sqlCommand = cursor.execute("(SELECT id FROM tbl_User WHERE id = %d)" % user_index).fetchone()[0]
    values = [userphone_index, user_phone, user_sqlCommand]
    

    这就是解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 2015-05-27
      • 2019-09-09
      相关资源
      最近更新 更多