From 8f5b01564e3acf6e9532df9a56445886bd5d7fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 2 Sep 2026 11:43:46 +0200 Subject: [PATCH] Store delete rule of column per constraint If a column is used for different foreign keys with different delete rules, the foreign key may be recreated if the last rule stored is different. Closes #15053 (grafted from 636865d7fc72d5e59d9a7bb447de8b87743cc5ad) --HG-- branch : 8.0 --- trytond/trytond/backend/postgresql/table.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/trytond/trytond/backend/postgresql/table.py b/trytond/trytond/backend/postgresql/table.py index 1e2bd49786..0b81605ca7 100644 --- a/trytond/trytond/backend/postgresql/table.py +++ b/trytond/trytond/backend/postgresql/table.py @@ -243,14 +243,15 @@ class TableHandler(TableHandlerInterface): def _fk_deltypes(self): if self.__fk_deltypes is None: cursor = Transaction().connection.cursor() - cursor.execute('SELECT k.column_name, r.delete_rule ' + cursor.execute( + 'SELECT k.constraint_name, k.column_name, r.delete_rule ' 'FROM information_schema.key_column_usage AS k ' 'JOIN information_schema.referential_constraints AS r ' 'ON r.constraint_schema = k.constraint_schema ' 'AND r.constraint_name = k.constraint_name ' 'WHERE k.table_name = %s AND k.table_schema = %s', (self.table_name, self.table_schema)) - self.__fk_deltypes = dict(cursor) + self.__fk_deltypes = {r[:2]: r[2] for r in cursor} return self.__fk_deltypes @property @@ -430,7 +431,7 @@ class TableHandler(TableHandlerInterface): + ref_columns_name + '_fkey') if name in self._constraints: for column_name in columns: - if self._fk_deltypes.get(column_name) != on_delete: + if self._fk_deltypes.get((name, column_name)) != on_delete: self.drop_fk(columns, ref_columns) add = True break