| 
        php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
  [2008-11-19 10:23 UTC] fhardy at noparking dot net
 Description:
------------
Using mysqli::multi_query() in order to create database table in innodb format with foreign key failed with mysql 5.1 RC.
All is fine with mysql 5.0.67
Reproduce code:
---------------
<?php
$sql = 'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
DROP TABLE IF EXISTS `bank_transactions`;
CREATE TABLE `bank_transactions` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `client_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `client` (`client_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
DROP TABLE IF EXISTS `clients`;
CREATE TABLE `clients` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
ALTER TABLE `bank_transactions` ADD CONSTRAINT `bank_transactions_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`) ON UPDATE CASCADE;';
$mysqli = new mysqli('myhost', 'myuser', 'mypassword', 'mydatabase');
if ($mysqli->connect_error) {
    printf('Connect failed: %s\n', mysqli_connect_error());
} else {
	if (!$mysqli->multi_query($sql)) {
		printf('Unable to execute sql');
	} else {
		do {
			if ($result = $mysqli->store_result()) {
				$result->free();
			}
		} while ($mysqli->next_result());
	}
	$mysqli->close();
}
?>
Expected result:
----------------
Database "mydatabase" must contain two tables, clients and bank_transactions, and one constraint between this tables.
Actual result:
--------------
I have an empty database and no error message from mysqli object.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             
             | 
    |||||||||||||||||||||||||||
            
                 
                Copyright © 2001-2025 The PHP GroupAll rights reserved.  | 
        Last updated: Mon Nov 03 23:00:01 2025 UTC | 
Hi, I have tried both 5.2.7RC4 and 5.3-dev (with libmysql and mysqlnd) and can reproduce the problem. I have tracked the C/S traffic and there is an error in the middle of the multi-statement, which cancels the whole statement. I have added two var_dumps() to your example, like : $sql = 'SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; DROP TABLE IF EXISTS `bank_transactions`; CREATE TABLE `bank_transactions` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `client_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `client` (`client_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; DROP TABLE IF EXISTS `clients`; CREATE TABLE `clients` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; ALTER TABLE `bank_transactions` ADD CONSTRAINT `bank_transactions_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`) ON UPDATE CASCADE'; $mysqli = new mysqli('127.0.0.1', 'root', 'root', 'db'); if ($mysqli->connect_error) { printf('Connect failed: %s\n', mysqli_connect_error()); } else { if (!$mysqli->multi_query($sql)) { printf('Unable to execute sql'); } else { do { if ($result = $mysqli->store_result()) { var_dump($result); $result->free(); } else { var_dump(mysqli_error($mysqli)); } } while ($mysqli->next_result()); var_dump(mysqli_error($mysqli)); } $mysqli->close(); } and the output is : andrey@winnie:~/dev/tmp/php5.2-200811191530$ ./php ../../vanilla/php5_3/a.php string(0) "" string(0) "" string(54) "Can't create table 'db.bank_transactions' (errno: 150)" andrey@winnie:~/dev/tmp/php5.2-200811191530$ ./php -v PHP 5.2.7RC4-dev (cli) (built: Nov 19 2008 18:49:58) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies andrey@winnie:~/dev/tmp/php5.2-200811191530$ /work/mysql-server/mysql-5.1-binprot/extra/perror 150 MySQL error code 150: Foreign key constraint is incorrectly formed ---------- So I don't know why from the CLI the problem doesn't happen, it needs further analyse to see why the environment is different. Also probably needs a test case in C using libmysql, which will probably exhibit the same problems.