MySqlException: невозможно добавить или обновить дочернюю строку: ограничение Foreign_key не выполнено
при выполнении этого кода:
Код: Выделить всё
INSERT INTO networks (owner_name, name, password, ip, visible)
VALUES ('alex', 'alex_net', '1234', '192.168.1.1', 1)
ON DUPLICATE KEY
UPDATE name='alex_net', password = '1234', ip = '192.168.1.1', visible = 1;
Почему он не работает в приложении, но работает в PhPMyAdmin?Я использую MySqlConnector/Mono
Функция C#, которая выполняет запрос:
Код: Выделить всё
public static bool InsertOrUpdateNetwork(MySqlConnection connection, NetworkSO networkData)
{
string sql =
$"INSERT INTO networks (owner_name, name, password, ip, visible) " +
$"VALUES ('{networkData.ownerName}', '{networkData.name}', '{networkData.password}', '{networkData.ip}', {networkData.visible}) " +
$"ON DUPLICATE KEY " +
$"UPDATE name='{networkData.name}', password='{networkData.password}', ip='{networkData.ip}', visible={networkData.visible}";
MySqlCommand cmd = new MySqlCommand(sql, connection);
int result = cmd.ExecuteNonQuery();
return result > 0;
}
Код: Выделить всё
CREATE TABLE networks (
owner_name varchar(16) NOT NULL,
name varchar(16) DEFAULT NULL,
password varchar(16) DEFAULT NULL,
ip varchar(15) NOT NULL,
visible tinyint(4) NOT NULL,
PRIMARY KEY (owner_name),
UNIQUE KEY owner_name_UNIQUE (owner_name),
CONSTRAINT fk_network_owner_name FOREIGN KEY (owner_name) REFERENCES users (name) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE users (
name varchar(16) NOT NULL,
password varchar(16) DEFAULT NULL,
logged tinyint(4) DEFAULT NULL,
PRIMARY KEY (name),
UNIQUE KEY name_UNIQUE (name)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Код: Выделить всё
MySqlException: Cannot add or update a child row: a foreign key constraint fails (sql7721749.networks, CONSTRAINT fk_network_owner_name` FOREIGN KEY (owner_name) REFERENCES users (name) ON DELETE CASCADE ON UPDATE CASCADE)
Это позволило мне вставлять/обновлять данные, и когда я удалил пользователя, сеть, ограниченная именем пользователя, также была удалена, поэтому она по-прежнему работает по назначению.
Но Интересно, почему это произошло и правильное ли это решение.
Подробнее здесь: https://stackoverflow.com/questions/788 ... aint-fails