#sql-server
#sql-server
Вопрос:
Итак, я попытался вставить данные в таблицу «customer», но я всегда получаю эту определенную ошибку (внизу). Может ли кто-нибудь точно определить, пропустил ли я что-нибудь или этого не хватает?
create table rooms
(
roomid int identity(1,1) primary key,
roomNo varchar(250) not null unique,
roomType varchar(250) not null,
bed varchar(250) not null,
price bigint not null,
booked varchar(50) default 'NO'
);
insert into rooms (roomNo, roomType, bed, price) values (010, 'Studio with AC', 'Single', '1000');
create table customer
(
cid int identity(1,1) primary key,
cname varchar(250) not null,
mobile bigint not null,
nationality varchar(250) not null,
gender varchar(50) not null,
dob varchar(50) not null,
idproof varchar(50) not null,
addres varchar(250) not null,
checkIn varchar(250) not null,
checkOut varchar(250),
chekOut varchar(250) not null default 'NO',
roomid int foreign key references rooms(roomid)
);
insert into customer (cname,mobile,nationality,gender,dob,idproof,addres,checkIn,customer.roomid) values ('Kayano Ai', 09238400394, 'Japanese', 'Female', '01-02-1998', '8923giaf', 'Somewhere', 'YES', 20);
сообщение об ошибке, которое я получил, — это
оператор INSERT, конфликтующий с ограничением ВНЕШНЕГО КЛЮЧА «FK__customer__roomid__1F98B2C1». Конфликт произошел в базе данных «myHotel», таблица «dbo.rooms», столбец «roomid».
Комментарии:
1. И удовлетворяется ли ограничение внешнего ключа наличием существующей строки
rooms
? Как мы можем ее решить, не видя вашего оператора insert и содержимого вашей таблицы?2. Блок кода не определяет требования, поэтому мы должны предположить. Если ваша цель состоит в том, чтобы вставить строку в rooms, а затем вставить строку в customer, используя идентификатор предыдущего оператора, то вы делаете это неправильно. Ваша вторая вставка использует жестко заданное значение для roomid — почему это? Подумайте об этом немного. Разве вам НЕ нужно каким-то образом получить значение идентификатора, сгенерированное для строки, вставленной первым оператором?
3. И я укажу, что клиент может арендовать несколько комнат одновременно. Хороший клиент будет постоянно останавливаться в вашем отеле / заведении. Проектирование баз данных — это совсем другой навык, чем написание запросов tsql и приложений, использующих базу данных. Честно говоря, типы данных, которые вы выбрали для своих таблиц, просто беспорядок. Как и столбцы
checkOut
иchekOut
— никто, кроме вас, не поймет разницы.
Ответ №1:
Когда вы вводите строку в таблицу customer, customer.roomid должен сначала существовать в таблице rooms.
Сначала убедитесь, что номер существует, или вставьте новый номер.
INSERT INTO rooms ( roomid,roomNo, ...) VALUES (1,'room1',...);
Затем вставьте в customer с custormer.roomid, который существует в таблице room (1 в примере)
INSERT INTO customer ( cid,cname,roomid ...) VALUES (15,'customer name',1,...);
Комментарии:
1. Но roomid в rooms (не room) — это столбец идентификаторов — ваше решение прерывается при первом утверждении. tsql также не использует двойные символы в качестве разделителя строк.
2. Обновил запрос по вашим комментариям