webForumDet fria alternativet

Hämta ut foreign key name ur MySql-databastabell

PHPur PHP

4 svar · 763 visningar · startad av webbo

Medlem sedan maj 201131 inlägg
Frågan#1

Jag vill, via ett PHP-script, veta vad en viss foreign key har för namn i min databastabell.

Hittade denna funktion för MySql-frågan i terminalen:

show create table

Som ger mig något i stil med:

host_contacts | CREATE TABLE `host_contacts` (
  `id` int(11) NOT NULL auto_increment,
  `host_id` int(11) NOT NULL,
  `contact_id` int(11) NOT NULL,
  `updated_by_id` int(11) default NULL,
  `updated_time` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `idx_host_contacts_unique` (`host_id`,`contact_id`),
  KEY `updated_by_id` (`updated_by_id`),
  KEY `contact_id` (`contact_id`),
  CONSTRAINT `host_contacts_ibfk_1` FOREIGN KEY (`updated_by_id`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `host_contacts_ibfk_2` FOREIGN KEY (`host_id`) REFERENCES `hosts` (`id`) ON DELETE CASCADE,
  CONSTRAINT `host_contacts_ibfk_3` FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 |

Så långt är jag med. Men hur ska mitt PHP script se ut för att få ut t.ex. namnet på foreign key för kolumnen "host_id"??

Jag vill kunna göra något i stil med:


function getFKname('host_contacts',  'host_id', 'hosts',  'id')
{
  // ...
}

echo 'FK name is: ' . getFKname('host_contacts',  'host_id', 'hosts',  'id');

Som alltså i detta fall ska skriva ut:

FK name is: host_contacts_ibfk_2

En tuff nöt att knäcka! Tack för hjälp!

Medlem sedan maj 201131 inlägg
#2

Hmm, borde kunna använda funktionen preg_match_all, men hur ska mitt pattern se ut? Hmm... Någon?

Medlem sedan maj 201131 inlägg
#3

webbo skrev:

Hmm, borde kunna använda funktionen preg_match_all, men hur ska mitt pattern se ut? Hmm... Någon?

Någon regexp-expert där ute?

Medlem sedan maj 201131 inlägg
#4

Så här ser ju en FK rad ut (ur SHOW CREATE TABLE vyn):

CONSTRAINT `host_contacts_ibfk_1` FOREIGN KEY (`updated_by_id`) REFERENCES `users` (`id`) ON DELETE SET NULL

Borde jag inte kunna få ut att sådana rader m.h.a. detta regexp:

		
$fk_pattern = "/CONSTRAINT `[a-z0-9_]` FOREIGN KEY \(`[a-z0-9_]`\) REFERENCES `[a-z0-9_]` \(`[a-z0-9_]`\) ON DELETE [a-z ]/";
		
preg_match_all($fk_pattern, $table_structure, $fks);

Alla foreign keys ska alltså lagras i arrayen $fks, men jag får ett tomt resultat...

Vad är felet?

Medlem sedan dec. 200012 464 inlägg
#5
select constraint_name
  from information_schema.key_column_usage
 where table_name = 'host_contacts'
    and column_name = 'host_id'
141 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)