DataJoint:删除时出现 IntegrityError table
DataJoint: IntegrityError while dropping table
我正在设计我们的数据库,在 common_exp
模式中有一个名为 Session
的 table,定义如下:
@schema
class Session(dj.Manual):
definition = """ # Information about the session and experimental setup
-> common_mice.Mouse
day : date # Date of the experimental session (YYYY-MM-DD)
trial : tinyint # Counter of experimental sessions on the same day (base 1)
---
id : varchar(128) # Unique identifier
path : varchar(256) # Relative path of this session on the server
counter : smallint # Overall counter of all sessions across mice (base 0)
experimenter : varchar(128) # Who actually performed the experiment, must be a username from Investigator
-> Anesthesia
-> Setup
-> Task
notes : varchar(2048) # description of important things that happened
"""
我想更改一些属性的名称,因此想删除 table。但是,我遇到了这个错误:
common_exp.Session().drop()
`common_exp`.`session` (0 tuples)
Proceed? [yes, No]: >? yes
Traceback (most recent call last):
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\IPython\core\interactiveshell.py", line 3441, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-4-bce682713228>", line 1, in <module>
common_exp.Session().drop()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\table.py", line 474, in drop
FreeTable(self.connection, table).drop_quick()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\table.py", line 450, in drop_quick
self.connection.query(query)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\connection.py", line 302, in query
self._execute_query(cursor, query, args, suppress_warnings)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\connection.py", line 268, in _execute_query
raise translate_query_error(err, query)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\connection.py", line 266, in _execute_query
cursor.execute(query, args)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\cursors.py", line 148, in execute
result = self._query(query)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\cursors.py", line 310, in _query
conn.query(q)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\connections.py", line 548, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\connections.py", line 775, in _read_query_result
result.read()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\connections.py", line 1156, in read
first_packet = self.connection._read_packet()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\connections.py", line 725, in _read_packet
packet.raise_for_error()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.IntegrityError: (1217, 'Cannot delete or update a parent row: a foreign key constraint fails')
如您所见,table 是空的,没有进一步的依赖项。错误消息也没有告诉我是哪个键导致了问题,或者是其他键 table,所以我有点困惑问题出在哪里。
我正在使用 root 帐户访问数据库,因此权限应该不是问题。从其他模式中删除 tables 是有效的,只是这个模式会产生这个错误。
此错误表明 common_exp.Session
下游有一个从属 table 需要先删除,然后才能删除 Session
。
通常,DataJoint 将级联并丢弃所有下游 table。但是,有时 DataJoint 看不到相关的 tables,因为它们位于尚未加载的不同模式中。您将需要加载生成此引用的模式,以便 DataJoint 级联放置。您可以使用 dj.list_schemas()
查看所有可用的架构。
感谢提问-
基于 table 中没有记录但删除失败并出现此错误的事实,似乎确实有下游 table 定义了外键返回到session table,因此删除 session table 会留下这些 tables 'orphaned',从而造成完整性错误。从示例中不清楚情况并非如此。
以下 SQL 查询在模式级别检查 forward/reverse 依赖关系(回答问题:“哪个模式依赖于其他哪些模式”):
SELECT distinct(UNIQUE_CONSTRAINT_SCHEMA)
FROM information_schema.REFERENTIAL_CONSTRAINTS
where constraint_schema='my_schema'; -- forward dependencies for 'my_schema'
SELECT distinct(CONSTRAINT_SCHEMA)
FROM information_schema.REFERENTIAL_CONSTRAINTS
where unique_constraint_schema='my_schema'; -- reverse dependencies for 'my_schema'
很遗憾,我不记得确切的列,但 table 级别的信息在信息架构中也可用。
我正在设计我们的数据库,在 common_exp
模式中有一个名为 Session
的 table,定义如下:
@schema
class Session(dj.Manual):
definition = """ # Information about the session and experimental setup
-> common_mice.Mouse
day : date # Date of the experimental session (YYYY-MM-DD)
trial : tinyint # Counter of experimental sessions on the same day (base 1)
---
id : varchar(128) # Unique identifier
path : varchar(256) # Relative path of this session on the server
counter : smallint # Overall counter of all sessions across mice (base 0)
experimenter : varchar(128) # Who actually performed the experiment, must be a username from Investigator
-> Anesthesia
-> Setup
-> Task
notes : varchar(2048) # description of important things that happened
"""
我想更改一些属性的名称,因此想删除 table。但是,我遇到了这个错误:
common_exp.Session().drop()
`common_exp`.`session` (0 tuples)
Proceed? [yes, No]: >? yes
Traceback (most recent call last):
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\IPython\core\interactiveshell.py", line 3441, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-4-bce682713228>", line 1, in <module>
common_exp.Session().drop()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\table.py", line 474, in drop
FreeTable(self.connection, table).drop_quick()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\table.py", line 450, in drop_quick
self.connection.query(query)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\connection.py", line 302, in query
self._execute_query(cursor, query, args, suppress_warnings)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\connection.py", line 268, in _execute_query
raise translate_query_error(err, query)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\datajoint\connection.py", line 266, in _execute_query
cursor.execute(query, args)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\cursors.py", line 148, in execute
result = self._query(query)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\cursors.py", line 310, in _query
conn.query(q)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\connections.py", line 548, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\connections.py", line 775, in _read_query_result
result.read()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\connections.py", line 1156, in read
first_packet = self.connection._read_packet()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\connections.py", line 725, in _read_packet
packet.raise_for_error()
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "C:\Anaconda3\envs\datajoint_wahl\lib\site-packages\pymysql\err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.IntegrityError: (1217, 'Cannot delete or update a parent row: a foreign key constraint fails')
如您所见,table 是空的,没有进一步的依赖项。错误消息也没有告诉我是哪个键导致了问题,或者是其他键 table,所以我有点困惑问题出在哪里。
我正在使用 root 帐户访问数据库,因此权限应该不是问题。从其他模式中删除 tables 是有效的,只是这个模式会产生这个错误。
此错误表明 common_exp.Session
下游有一个从属 table 需要先删除,然后才能删除 Session
。
通常,DataJoint 将级联并丢弃所有下游 table。但是,有时 DataJoint 看不到相关的 tables,因为它们位于尚未加载的不同模式中。您将需要加载生成此引用的模式,以便 DataJoint 级联放置。您可以使用 dj.list_schemas()
查看所有可用的架构。
感谢提问-
基于 table 中没有记录但删除失败并出现此错误的事实,似乎确实有下游 table 定义了外键返回到session table,因此删除 session table 会留下这些 tables 'orphaned',从而造成完整性错误。从示例中不清楚情况并非如此。
以下 SQL 查询在模式级别检查 forward/reverse 依赖关系(回答问题:“哪个模式依赖于其他哪些模式”):
SELECT distinct(UNIQUE_CONSTRAINT_SCHEMA)
FROM information_schema.REFERENTIAL_CONSTRAINTS
where constraint_schema='my_schema'; -- forward dependencies for 'my_schema'
SELECT distinct(CONSTRAINT_SCHEMA)
FROM information_schema.REFERENTIAL_CONSTRAINTS
where unique_constraint_schema='my_schema'; -- reverse dependencies for 'my_schema'
很遗憾,我不记得确切的列,但 table 级别的信息在信息架构中也可用。