From 80f9278d343fb3e95c68ff424a9a0d79063d5e8b Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Wed, 14 Jan 2026 21:59:58 +0000 Subject: [PATCH] PostgreSQL: Allow creating NOT DEFERRABLE foreign keys --- CHANGELOG.md | 1 + adminer/drivers/pgsql.inc.php | 3 ++- adminer/foreign.inc.php | 1 + adminer/include/editing.inc.php | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index afbcb0d9..0e37c63d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - Pretty print JSON in edit - PostgreSQL: Offer foreign keys in create table - PostgreSQL: Add missing parentheses to CHECK export +- PostgreSQL: Allow creating NOT DEFERRABLE foreign keys - PostgreSQL: Remove duplicate DEFERRABLE in foreign key export - PostgreSQL: Add schema to sequence and and view export - PostgreSQL: Mark unique partial indexes as unique (bug #1172) diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 474a516d..e85d8d34 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -561,12 +561,13 @@ ORDER BY indisprimary DESC, indisunique DESC", $connection2) as $row function foreign_keys($table) { $return = array(); foreach ( - get_rows("SELECT conname, condeferrable::int AS deferrable, pg_get_constraintdef(oid) AS definition + get_rows("SELECT conname, condeferrable::int AS deferrable, condeferred::int AS deferred, pg_get_constraintdef(oid) AS definition FROM pg_constraint WHERE conrelid = " . driver()->tableOid($table) . " AND contype = 'f'::char ORDER BY conkey, conname") as $row ) { + $row['deferrable'] = ($row['deferrable'] ? '' : 'NOT ') . 'DEFERRABLE' . ($row['deferred'] ? ' INITIALLY DEFERRED' : ''); if (preg_match('~FOREIGN KEY\s*\((.+)\)\s*REFERENCES (.+)\((.+)\)(.*)$~iA', $row['definition'], $match)) { $row['source'] = array_map('Adminer\idf_unescape', array_map('trim', explode(',', $match[1]))); if (preg_match('~^(("([^"]|"")+"|[^"]+)\.)?"?("([^"]|"")+"|[^"]+)$~', $match[2], $match2)) { diff --git a/adminer/foreign.inc.php b/adminer/foreign.inc.php index 5f124b7d..bfccbf08 100644 --- a/adminer/foreign.inc.php +++ b/adminer/foreign.inc.php @@ -103,6 +103,7 @@ foreach ($row["source"] as $key => $val) {

+ "innodb-foreign-key-constraints.html", 'mariadb' => "foreign-keys/", diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 1aa74faf..ddcf7f58 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -491,6 +491,7 @@ function format_foreign_key(array $foreign_key): string { . " (" . implode(", ", array_map('Adminer\idf_escape', $foreign_key["target"])) . ")" //! reuse $name - check in older MySQL versions . (preg_match("~^(" . driver()->onActions . ")\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "") . (preg_match("~^(" . driver()->onActions . ")\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "") + . ($foreign_key["deferrable"] ? " $foreign_key[deferrable]" : "") ; }