首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataJoint:删除表时的IntegrityError

DataJoint:删除表时的IntegrityError
EN

Stack Overflow用户
提问于 2021-06-22 23:29:46
回答 2查看 22关注 0票数 1

我正在设计我们的数据库,并且在common_exp模式中有一个名为Session的表,其定义如下:

代码语言:javascript
复制
@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
    """

我想要更改一些属性的名称,因此想要删除该表。然而,我遇到了这个错误:

代码语言:javascript
复制
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')

正如您所看到的,该表是空的,并且没有进一步的依赖关系。错误消息也没有告诉我哪个键产生了问题,或者哪个表产生了问题,所以我有点困惑问题可能出在哪里。

我使用root帐户访问数据库,所以权限应该不是问题。从其他模式中删除表是可行的,只是这个模式会产生这个错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-23 00:08:05

谢谢你的问题-

根据表中没有记录,但删除失败并出现此错误这一事实,似乎确实存在使用外键定义回会话表的下游表,因此删除会话表将使这些表成为“孤立”表,从而创建完整性错误。从示例中看不出事实并非如此。

以下SQL查询在模式级别检查正向/反向依赖关系(回答问题:“哪个模式取决于哪些其他模式”):

代码语言:javascript
复制
    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'

不幸的是,我记不起确切的列了,但是信息模式中也提供了表级信息。

票数 0
EN

Stack Overflow用户

发布于 2021-06-22 23:56:14

此错误表示在删除Session之前,需要删除common_exp.Session下游的一个依赖表。

通常,DataJoint将级联并删除所有下游表。但是,有时DataJoint看不到依赖表,因为它们位于尚未加载的不同模式中。您将需要加载进行此引用的架构,以便允许DataJoint级联drop。您可以使用dj.list_schemas()查看所有可用的模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68086496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档