Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

Hỏi về khóa ngoại trong sql

14:08 25-06-2021 1.087 lượt xem 3 bình luận 22:14 26-06-2021

Chào anh Long, em đang làm CSDL phân quyền cho người dùng bằng linq. Em tạo 2 bảng: Role và UserRole. Lúc em thêm dữ liệu vào thì nó báo lỗi:

CREATE DATABASE LOGIN_ROLE
GO
USE LOGIN_ROLE
GO
CREATE TABLE ROLE
(
	USERROLE VARCHAR(50) PRIMARY KEY
)
GO
CREATE TABLE USERROLE
(
	USERID VARCHAR(50)
	FOREIGN KEY(USERID) REFERENCES dbo.ROLE(USERROLE)
)
GO
INSERT dbo.USERROLE
(
    USERID
)
VALUES
(
'1'-- USERID - varchar(50)
    )
	INSERT dbo.USERROLE
(
    USERID
)
VALUES
(
'2'-- USERID - varchar(50)
    )
GO
INSERT dbo.ROLE
(
    USERROLE
)
VALUES
('Admin' -- USERROLE - varchar(50)
    )
	INSERT dbo.ROLE
(
    USERROLE
)
VALUES
('User' -- USERROLE - varchar(50)
    )
GO
Msg 547, Level 16, State 0, Line 16
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__USERROLE__USERID__25869641". The conflict occurred in database "LOGIN_ROLE", table "dbo.ROLE", column 'USERROLE'.
The statement has been terminated.
Msg 547, Level 16, State 0, Line 24
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__USERROLE__USERID__25869641". The conflict occurred in database "LOGIN_ROLE", table "dbo.ROLE", column 'USERROLE'.
The statement has been terminated.

Lỗi này là sao anh và cách khắc phục?

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
JuffyInaba đã bình luận 15:01 25-06-2021

Lỗi: cố gắng insert dữ liệu vào một bảng USERROLE mà có cột USERID (khóa ngoại ) liên kết với với cột USERROLE (khóa chính) ở một bảng khác ROLE, Mà bên khóa chính chưa tồn tại dữ liệu đó.

Bạn có thể giải quyến vấn đề bằng việc ưu tiên INSERT dữ liệu có khóa chính trước.
Ngoài ra mình xin phép sửa lại câu lệnh CREATE TABLE của bạn như sau để bạn dễ hiểu hơn

CREATE DATABASE LOGIN_ROLE
GO
USE LOGIN_ROLE
GO
create table ROLE
(
  roleId varchar(50) PRIMARY KEY,
  roleName nvarchar(100)
)
go
create table USERROLE
(
  userId varchar(50) PRIMARY KEY,
  userName nvarchar(100),
  roleId varchar(50),
  FOREIGN KEY(roleId) REFERENCES dbo.ROLE(roleId)
)
go

Đến phần INSERT

-- Role trước
INSERT dbo.ROLE (roleId, roleName) VALUES (1, 'Admin')
INSERT dbo.ROLE (roleId, roleName) VALUES (2, 'User')
GO
-- User sau
INSERT dbo.USERROLE (userId, userName, roleId) VALUES ('a', N'Tý', 1)
INSERT dbo.USERROLE (userId, userName, roleId) VALUES ('b', N'Tèo', 2)
INSERT dbo.USERROLE (userId, userName, roleId) VALUES ('c', 'Anonymous', 3) --Chạy câu lệnh này chắc chắn sẽ lỗi, vì bên bảng ROLE chưa có quyền nào có roleId = 3
GO

 

VoTanDuc đã bình luận 17:03 25-06-2021

Minh đã insert dữ liệu vào bảng Role chứa khóa chính trước mà sao nó vẫn báo lỗi. Mình không hiểu

Tạo bảng:

CREATE DATABASE LOGIN_ROLE
GO
USE LOGIN_ROLE
GO
CREATE TABLE ROLE
(
	USERROLE VARCHAR(50) PRIMARY KEY
)
GO
CREATE TABLE USERROLE
(
	USERID VARCHAR(50)
	FOREIGN KEY(USERID) REFERENCES dbo.ROLE(USERROLE)
)
GO

Insert dữ liệu:

INSERT dbo.ROLE
(
    USERROLE
)
VALUES
('Admin' -- USERROLE - varchar(50)
    )
INSERT dbo.ROLE
(
    USERROLE
)
VALUES
('User' -- USERROLE - varchar(50)
    )
GO
INSERT dbo.USERROLE
(
    USERID
)
VALUES
('1' -- USERID - varchar(50)
    )
INSERT dbo.USERROLE
(
    USERID
)
VALUES
('2' -- USERID - varchar(50)
    )
GO

 

Câu hỏi mới nhất