两个表共享一个唯一标识符“id”。这两个表都打算通过使用“id”来连接。将“id”定义为两个表中的自动递增主键可能会导致更新不一致。
是否有一些通用模式可以避免这种情况,或者我是否必须先使用最后插入的 id 来处理更新 table1 和 table2(因此不在 table2 中将 id 声明为 auto inc)?
两个表共享一个唯一标识符“id”。这两个表都打算通过使用“id”来连接。将“id”定义为两个表中的自动递增主键可能会导致更新不一致。
是否有一些通用模式可以避免这种情况,或者我是否必须先使用最后插入的 id 来处理更新 table1 和 table2(因此不在 table2 中将 id 声明为 auto inc)?
在任意数量的表中,相同的列名“id”没有问题。
几个持久层框架以同样的方式做这件事。
只需在您的 SQL 中使用别名来相应地区分您的表。
我是否必须先通过使用最后插入的 id 来处理更新 table1 和 table2(因此不在 table2 中将 id 声明为 auto inc)?
是的。并将 id 设为外键,因此如果它已存在于 table1 中,则它只能存在于 table2 中。
是的,你这样做了,记住将操作包装在事务中。
首先,如果您在 MySQL 中使用 InnoDB 表引擎,您可以同时使用事务和外键来实现数据一致性。
其次,在第一个表中插入之后,您可以获得最后一个插入 id(取决于您访问数据库的方式)并将其用作外键。
例如 表 1: Users
:user_id, username
表 2: User_Profiles
:user_id, name, phone
在 User_Profiles 中,您不需要定义为自动增量,但首先在表中user_id
插入一条记录并使用记录。如果您在事务中执行此操作,则在事务连接完成之前不会在事务连接之外看到记录,这样您就可以保证即使在插入用户之后但在插入配置文件之前发生了一些不好的事情 - 不会t 被弄乱的数据。Users
user_id
User_Profiles
Users
您还可以将表中的user_id
列定义为User_Profiles
表的外键,Users
因此如果有人从Users
表中删除一条记录,数据库将自动删除User_Profiles
. 还有许多其他选项 - 阅读更多相关信息。