这是我创建的表:
CREATE TABLE personal_info (
Person_name VARCHAR(30) NOT NULL,
Date_of_Birth DATE,
Join_date DATE,
Join_year NUMBER,
Person_address VARCHAR(75),
Person_Post VARCHAR(15),
Person_id VARCHAR(9) NOT NULL UNIQUE,
Email_primary VARCHAR(30),
Phone_primary NUMBER,
Email_secondary VARCHAR(30),
Phone_secondary NUMBER,
Sal_grade CHAR(1) NOT NULL,
Empl_id NUMBER NOT NULL,
CONSTRAINT FK_Salary_Person FOREIGN KEY (Sal_grade) REFERENCES salary(Salary_grade) ON DELETE CASCADE,
CONSTRAINT FK_Employee_Person FOREIGN KEY (Empl_id) REFERENCES employee(Employee_id) ON DELETE CASCADE,
CONSTRAINT UC_Person_ID UNIQUE (Empl_id,Person_name)
);
以下是员工表:
CREATE TABLE employee (
Employee_id NUMBER NOT NULL PRIMARY KEY,
Employee_job_description VARCHAR(200),
Proj_id NUMBER NOT NULL,
Dep_id NUMBER NOT NULL
);
ALTER TABLE employee
ADD CONSTRAINT FK_project_employee
FOREIGN KEY (Proj_id) REFERENCES PROJECTS(Project_id) ON DELETE CASCADE;
ALTER TABLE employee
ADD CONSTRAINT FK_dept_employee
FOREIGN KEY (Dep_id) REFERENCES dept(Dept_id) ON DELETE CASCADE;
CREATE SEQUENCE EMPID_SEQ1
MINVALUE 1
MAXVALUE 9999999
START WITH 10000
INCREMENT BY 4
CACHE 20;
我已经插入到雇员表中,没有问题。
INSERT INTO employee (Employee_id, Employee_job_description, Proj_id, Dep_id) VALUES(EMPID_SEQ1.NEXTVAL,'SENIOR VICE PRESIDENT',501,1);
但是当我尝试插入到PERSONAL_INFO表中时:
/* Formatted on 19-Oct-22 11:58:19 AM (QP5 v5.256.13226.35538) */
INSERT INTO PERSONAL_INFO (Empl_id,
Person_name,
Date_of_Birth,
Join_date,
Join_year,
Person_address,
Sal_grade,
Actual_salary,
Person_Post,
PERSON_ID,
Email_primary,
Phone_primary,
Email_secondary,
Phone_secondary)
VALUES (EMPID_SEQ1.CURRVAL,
'Mr. FF',
TO_DATE ('1980/05/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),
TO_DATE ('2000/05/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),
TO_CHAR (Join_DATE, 'YYYY'),
'Banani,Dhaka.',
'D',
150000,
'SVP',
TO_CHAR(TO_CHAR(Join_YEAR) || TO_CHAR (EMPID_SEQ1.CURRVAL)),
'FF@bank.com',
01234567891,
'FFF@bank.com',
99998882222);
我在插入PERSON_ID唯一关键字值时遇到了上述错误。基本上我希望PERSON_ID看起来像“200710016”。加入年份后面跟雇员ID。
但它告诉我这里不允许使用JOIN_YEAR列。
2条答案
按热度按时间v8wbuo2f1#
您不能引用刚插入的列-您必须再次“重复”相同的数据。
此外,还应该修改目标表(两种数据类型--电话号码不是真正的“数字”,因为可能有前导零;缺少一列)。
在序列中,您必须首先选择
nextval
,然后选择currval
,因为最初currval
不存在。修复后:
插入:
6jygbczu2#
表中不应有
join_year
列,因为该值可以从join_date
列计算出来,如果它是独立的,则两列可能会不同步。如果确实要在表中有它,则它应该是虚拟列。对于person_id
也是如此(尽管如果出于业务原因需要持久保存person_id
以便以后可以对其进行更改,那么可以使用BEFORE INSERT
触发器而不是使用虚拟列来设置它,但无论采用哪种方式,都不需要在INSERT
语句中提供从其他列派生的缺省值):EMPID_SEQ1
序列从10000开始,按4递增,最大值为9999999,Person_id
列可以包含9个字符,其中4个是年份,因此一旦表中有22500人并且序列达到100000,那么对于Person_id
列来说,它将太大。您可能应该将序列限制为99999,或者将Person_id
列设置得更大。*NUMBER
列中,因此您应该将电话号码存储为VARCHAR2
。*actual_salary
列。*然后您可以用途:
fiddle