Я использую драйвер sqlsrv pdo (использовал версии 5.2 и 5.3) и вижу то, что считаю непреднамеренным поведением.Надеюсь, я что-то не так делаю.
Я создал 2 таблицы в SQL Express 2008. Одна ( Locations ) - это таблица первичных ключей, используемая совместно с другими таблицами.Другая таблица ( Комнаты ) имеет 2 (или более) столбца ... ключевой столбец, связанный как внешний ключ с первой таблицей и одним (или более) столбцами данных.Вот так это выглядит:
Locations
LocationID int
1
2
3
4
5
Номера
LocationID int, Roomname varchar (50)
2, «жилой»
4, «обеденный»
2,4 обе ссылки обратно на таблицу Locations.
Затем я создаю уникальное ограничение для столбца Roomname:
ALTER TABLE Rooms ADD CONSTRAINT UniqueRoom UNIQUE (Roomname)
Затем я создал INSTEADТриггер OF INSERT для таблицы Rooms :
CREATE TRIGGER [dbo].[Rooms_INSERT]
on [dbo].Rooms
INSTEAD OF INSERT
as
BEGIN
INSERT INTO dbo.Locations DEFAULT VALUES
INSERT INTO dbo.Rooms select @@IDENTITY, Roomname from inserted
END
Теперь я могу вставлять данные в таблицу комнат с помощью:
INSERT INTO Rooms VALUES (null, 'roomname')
Я использую объект sqlsrv PDO длявставка данных через PHP:
$db = new PDO("sqlsrv:server=$serverName;Database=db", "", "");
$sql=("insert into Rooms values (null,?)");
$dbobj = $db->prepare($sql);
if($dbobj->execute(array("dining")))
print "<p>insert successful</p>";
else
print "<p>insert unsuccessful</p>";
Начиная с приведенного выше списка таблиц, я получаю следующие результаты:
- Измените оператор вставки на "вставить в значения Rooms (?)" -терпит неудачу как ожидалось, потому что это ожидает два аргумента, "вставка неудачна".
- Вернуть оператор вставки в нормальное состояние, попытка вставить массив ("спальня") - успешно выполнено, как и ожидалось, "вставить успешно."
- Повторно попытаться вставить массив ("спальня") - дБвставка не удалась, ни в одной из таблиц не было выполнено ни одной записи, но сообщается, что попытка успешна, "вставка успешна".
Почему 3-я попытка считается успешной, если в базу данных не было внесено длительных записей?Или, более конкретно, как я могу изменить либо мой PHP, либо мой SQL, чтобы правильно определять, когда такая вставка завершается неудачно из-за нарушения уникального ограничения?