有人可以帮助我使用这个mysql代码

时间:2017-12-01 22:18:57

标签: mysql sql

我正在尝试插入一些数据,但它不起作用,我正在使用SQL学习数据库

CREATE DATABASE INSTITUTO2;
USE INSTITUTO2;

CREATE TABLE Alumnos (
    Num_Alumno CHAR (4) ,
    Nombre CHAR (15),
    Apellidos CHAR (20),
    Dirección CHAR (30),
    Telefono CHAR (9),
    CP CHAR (14),
    Email CHAR(20)
    );
CREATE TABLE Asignaturas (
    Cod_Asignatura CHAR (2),
    Nombre CHAR(30),
    Creditos INT (2)
    );

CREATE TABLE Matricula (
    Num_Alumno CHAR (4),
    Cod_Asignatura CHAR (2),
    Nota_1EVA INT (2),
    Nota_2EVA INT (2),
    Nota_Junio INT (2),
    Nota_Septiembre FLOAT (6,2)
    );

ALTER TABLE Alumnos ADD CONSTRAINT PRIMARY KEY(Num_Alumno);
ALTER TABLE Alumnos MODIFY Telefono CHAR (9) NOT NULL;



ALTER TABLE Alumnos ADD CHECK (CP BETWEEN 28000 AND 28999);

ALTER TABLE Asignaturas ADD PRIMARY KEY PK_CODASIGNATURA (Cod_Asignatura);
ALTER TABLE Asignaturas MODIFY  Creditos INT (2) NOT NULL; 


ALTER TABLE Matricula ADD PRIMARY KEY PK_MATA (Num_Alumno,Cod_Asignatura); /

ALTER TABLE Matricula ADD FOREIGN KEY FK_NUMAL (Num_Alumno) REFERENCES Alumnos (Num_Alumno)ON DELETE CASCADE ON UPDATE CASCADE; 
ALTER TABLE Matricula ADD FOREIGN KEY FK_CODIGOSASIG (Cod_Asignatura)REFERENCES Asignaturas (Cod_Asignatura)ON DELETE CASCADE ON UPDATE CASCADE;


INSERT INTO Alumnos VALUES('0001','Oscar','Gonzalez','Mayor,5','911234567','28801','oscar@yahoo.es');
INSERT INTO Alumnos VALUES('0002','Miguel','Ortiz','Princesa,4','913216549','28804','Miguel@terra.es');
INSERT INTO Alumnos (Num_Alumno, Nombre,Apellidos ,Dirección ,Telefono ,CP) 
    VALUES('0003','Jose','Gomez','Salamanca,3','918794568','28805');    
INSERT INTO Alumnos VALUES('0004','Gema','Lopez','Mayor,8','918754981','28801','gema@terra.es');
INSERT INTO Alumnos (Num_Alumno, Nombre,Apellidos ,Dirección ,Telefono ,CP) 
    VALUES('0005','Javiel','Alonso','Ibiza,37','91875875','28814'); 


INSERT INTO Asignaturas (Cod_Asignatura, Nombre,Creditos)
        VALUES                  ('SI','Sistemas','8'),
                                ('PL','Programacion','12'),
                                ('AN','Analisis','10'),
                                ('RL','Redes locales','12'),
                                ('BD','Bases de datos','10');

INSERT INTO Matricula (Num_Alumno, Cod_Asignatura, Nota_1EVA, Nota_2EVA, Nota_Junio)
    VALUES                      ('003','AN','7','7','7'),
                                ('003','PL','6','6','6');

我不明白因为我先输入asignaturas表....非常感谢你

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`instituto2`.`matricula`, CONSTRAINT `matricula_ibfk_2` FOREIGN KEY (`Num_Alumno`) REFERENCES `alumnos` (`Num_Alumno`) ON DELETE CASCADE ON UPDATE CASCADE)

2 个答案:

答案 0 :(得分:0)

在你上次的INSERT中,你缺少一个'0'。

INSERT INTO Matricula (Num_Alumno, Cod_Asignatura, Nota_1EVA, Nota_2EVA, Nota_Junio)
VALUES ('0003','AN','7','7','7'), ('0003','PL','6','6','6');

答案 1 :(得分:0)

首先,您可以在表本身中包含主键和外键约束,以避免可能使事情变得更复杂的不必要代码。 所以你的表可以变成这样(也要记住有一个编写良好的格式化代码)。我还将使用VARCHAR而不是CHAR,因为它在内存分配和数据完整性方面要好得多。

CREATE TABLE Alumnos( 
Num_Alumno VARCHAR(4) NOT NULL, 
Nombre VARCHAR(15), 
Apellidos VARCHAR(20), 
Dirección VARCHAR(30), 
Telefono VARCHAR(9) NOT NULL, 
CP VARCHAR(14), 
Email VARCHAR(20),
PRIMARY KEY(Num_Alumno)
); 

CREATE TABLE Asignaturas( 
Cod_Asignatura VARCHAR (2), 
Nombre VARCHAR(30), 
Creditos INT(2) NOT NULL,
PRIMARY KEY(Cod_Asignatura)
);

CREATE TABLE Matricula( 
Num_Alumno VARCHAR(4), 
Cod_Asignatura VARCHAR(2), 
Nota_1EVA INT(2), 
Nota_2EVA INT(2),
Nota_Junio INT(2), 
Nota_Septiembre FLOAT(6,2),
PRIMARY KEY(Num_Alumno,Cod_Asignatura),
CONSTRAINT ForeignKey1
    FOREIGN KEY (Num_Alumno) 
    REFERENCES Alumnos (Num_Alumno)
    ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT ForeignKey1
    FOREIGN KEY (Cod_Asignatura)
    REFERENCES Asignaturas(Cod_Asignatura)
    ON DELETE CASCADE ON UPDATE CASCADE
);

现在假设您已经完成了数据库和表格的创建,您已准备好制作一些inserts。请注意,如果该键尚不存在,则无法添加其他表的外键值。因此,您必须在插入中保持正确的顺序。

更新:我在MySQL Workbench上测试了你的Inserts。您的问题是您指的是数据库中不存在的外键。更确切地说,你在写:

INSERT INTO Matricula (Num_Alumno, Cod_Asignatura, Nota_1EVA, Nota_2EVA, Nota_Junio) 
VALUES ('003','AN','7','7','7'), ('003','PL','6','6','6');

而不是

        Error                      Error
VALUES ('0003','AN','7','7','7'), ('0003','PL','6','6','6');

建议:这是一个很好的练习,因为你正在学习以这种方式使用ALTER来查看它的功能,但是在创建自己的数据库时尽量避免使用它。 ALTER服务器的目的是在数据库中进行更改,我们希望保持数据和其他方式的完整性。

总之。继续练习,并尝试编写更清晰的代码!还要注意错误,因为他们总是指出问题所在。