база данных: как создать таблицы каскадного обновления и запрашивать данные?

#mysql #database #cascade

#mysql #База данных #каскад

Вопрос:

Я хочу создать базу данных с двумя таблицами. Я хочу создать каскадное отношение обновления между двумя таблицами. Если SNAME был изменен в EMPLOYEE, то WORKREPORT также изменит его SNAME.

 EMPLOYEE:
SNO      SNAME           SPASSWORD     SEX      BDATE           HEIGHT    BTITLE
2014      boss            12345        male      1987-06-02       180       Manager
2015      Tom             1234567      male      1987-06-05       180       Employee


WORKREPORT
   SNO       SNAME             SDATA         SCHECKLIST       SIMAGE
   2014      boss            1987-06-02      abc               afafafaf
   2015      Tom             1987-06-05      affafa            afafafaf
 

Мой код работает очень хорошо. Мои проблемы заключаются в следующем: я не знаю, как запрашивать информацию только о сотруднике (а не о менеджере) из «ОТЧЕТА О РАБОТЕ», предположим, что сотрудников много. Что мне делать? Прав ли я насчет разработки «ОТЧЕТА О РАБОТЕ»?
Это мой код:

 CREATE database  if not exists cm360_cm360_1;
use cm360_cm360_1;
CREATE TABLE IF NOT EXISTS EMPLOYEE(SNO VARCHAR(7) NOT NULL,  SNAME VARCHAR(8) NOT NULL,  SPASSWORD VARCHAR(11) NOT NULL,SEX VARCHAR(8) NOT NULL,  BDATE DATETIME NOT NULL,  HEIGHT DEC(5,2) DEFAULT 000.00,BTitle VARCHAR(15) NOT NULL,  PRIMARY KEY(SNO), UNIQUE KEY (SNAME))ENGINE=InnoDB ;

SET SQL_SAFE_UPDATES=0;
INSERT INTO EMPLOYEE VALUES (2014,'boss','12345','male','2014-6-10 11:00:00',160.00,'Manager');
INSERT INTO EMPLOYEE VALUES (2015,'Tom','1234567','male','2014-6-10 12:00:00',160.00,'Employee');
SELECT * FROM EMPLOYEE;


CREATE TABLE IF NOT EXISTS WORKREPORT(SNO VARCHAR(7) NOT NULL,  SNAME VARCHAR(8) NOT NULL,SDATA DATETIME ,  SCHECKLIST VARCHAR(150),SIMAGE VARCHAR(20),FOREIGN KEY (SNO) REFERENCES EMPLOYEE (SNO) ON UPDATE CASCADE,FOREIGN KEY(SNAME) REFERENCES EMPLOYEE (SNAME) ON UPDATE CASCADE ) ENGINE=InnoDB;


INSERT INTO WORKREPORT VALUES (2014,'boss',' 2014-6-10 14:38:59','abc','afdsfdfds');
INSERT INTO WORKREPORT VALUES (2015,'Tom',' 2014-6-10 15:38:59','abc','afdsfdfds');
SELECT * FROM  WORKREPORT order by SDATA ASC;

UPDATE WORKREPORT SET SCHECKLIST='elevator;floor' WHERE SNAME='hanlu2';
delete from workreport WHERE  SIMAGE='N/A' AND SNAME='enlan';
 

Комментарии:

1. Вы используете ON UPDATE CASCADE . разве это не работает?

2. Это работает очень хорошо. Мои проблемы в том, что: я не знаю, как запросить информацию о сотруднике из «WORKREPORT», предположим, что сотрудников много.

3. Просто выполните соединение между таблицами со столбцом Fk.

Ответ №1:

Если вы хотите получить информацию о РАБОЧЕМ ОТЧЕТЕ сотрудника, запрос ниже должен работать..

 SELECT WORKREPORT.* 
FROM WORKREPORT, EMPLOYEE 
WHERE EMPLOYEE.SNO = WORKREPORT.SNO 
AND EMPLOYEE.BTITLE = "Employee"
 

Ответ №2:

Если вы просто хотите получить всю информацию о сотрудниках, вы можете JOIN использовать две таблицы в SNO и / или SNAME , поскольку у вас есть отношение FK к этим столбцам, и фильтровать по условию, которого BTITLE не должно быть MANAGER

 select e.*
from employee e
join workreport w on e.SNO = w.SNO
and e.SNAME = w.SNAME
and e.BTITLE <> 'Manager'