Acceder Registrarme

Problema de Tabla en Mysql


Por: Santos Rodriguez Publicado el: 2016-10-26 23:00:44 Pregunta abierta

Estoy haciendo mi base de datos en mysql, y tengo un pequeño problema, me sale que hay una llave duplicada en la tabla 'detalle_venta', y pues en la tabla Detalle_Compra tengo como fk idProducto, y lo mismo en la tabla Detalle_Venta, no quiero cambiar el esquema de mi base de datos, y si algo le falta sugieranmelo porfavor ):

 

Aca dejo mi script

 



create table Minimarcket

CREATE TABLE Categoria(
	idCategoria int auto_increment,
	Descrip_Categoria varchar(40) NOT NULL,
	constraint pk_idCategoria primary key (idCategoria)
);



CREATE TABLE Cliente(
	idCliente int auto_increment,
	Nom_Cliente varchar(30) NOT NULL,
	Ape_Cliente varchar(30) NOT NULL,
	DNI varchar(8) NOT NULL,
	Email varchar(40) NOT NULL,
	Telefono varchar(20) NOT NULL,
	Direccion varchar(30) NOT NULL,
	Fecha_Nac_Cli varchar(15) NOT NULL,
	Nacionalidad varchar(30) NOT NULL,
 constraint pk_idCliente primary key (idCliente)
);




CREATE TABLE Vendedor(
	idVendedor int auto_increment,
	Login varchar(30) NOT NULL,
	Contrasena varchar(30) NOT NULL,
	Nom_Vendedor varchar(30) NOT NULL,
	Ape_Vendedor varchar(30) NOT NULL,
	DNI varchar(8) NOT NULL,
	Email varchar(40) NOT NULL,
	Direccion varchar(40) NOT NULL,
	Telefono varchar(20) NOT NULL,
	Fecha_Nac_Vendedor varchar(15) NOT NULL,
	Nacionalidad varchar(30) NOT NULL,
	constraint pk_idVendedor primary key (idVendedor)
    );



    CREATE TABLE Proveedor(
	idProveedor int auto_increment,
	Razon_Social varchar(30) NOT NULL,
	RUC varchar(20) NOT NULL,
	Direccion varchar(30) NOT NULL,
	Telefono varchar(20) NOT NULL,
	Email varchar(30) NOT NULL,
	Cuenta_Contable varchar(30) NOT NULL,
	Nombre_Contacto varchar(30) NOT NULL,
	constraint pk_idProveedor primary key (idProveedor)
);



CREATE TABLE Marca(
	idMarca int auto_increment,
	Descrip_Marca varchar(40) NOT NULL,
    constraint pk_idMarca primary key (idMarca)
    );



CREATE TABLE Producto(
	idProducto int auto_increment,
	Codigo varchar(20) NOT NULL,
	idMarca int NOT NULL,
	idCategoria int NOT NULL,
	Stock int NOT NULL,
	Precio_Compra decimal(10, 2) NOT NULL,
	Precio_Venta decimal(10, 2) NOT NULL,
	constraint pk_idProducto primary key (idProducto),
	constraint fk_idMarca foreign key(idMarca) references marca(idMarca),
	constraint fk_idCategoria foreign key(idCategoria) references categoria(idCategoria)
);




CREATE TABLE Compra(
	idCompra int auto_increment,
	idProveedor int NOT NULL,
	Fecha_Compra date NOT NULL,
	OrdenCompra varchar(20) NOT NULL,
	GuiaRemision varchar(20) NOT NULL,
	constraint pk_idCompra primary key (idCompra),
	constraint fk_idProveedor foreign key(idProveedor) references proveedor(idProveedor)
);




CREATE TABLE Detalle_Compra(
	idCompra int NOT NULL,
	idProducto int NOT NULL,
	Cantidad int NOT NULL,
	constraint fk_idCompra foreign key(idCompra) references compra(idCompra),
	constraint fk_idProducto foreign key(idProducto) references producto(idProducto)
);



CREATE TABLE Venta(
	idVenta int auto_increment,
	idCliente int NOT NULL,
	idVendedor int NOT NULL,
	Deuda decimal(10, 2) NOT NULL,
	Precio_Venta decimal(10, 2) NOT NULL,
	Fecha_Venta date NOT NULL,
	constraint pk_idVenta primary key (idVenta),
	constraint fk_idCliente foreign key(idCliente) references cliente(idCliente),
	constraint fk_idVendedor foreign key(idVendedor) references vendedor(idVendedor)
);


CREATE TABLE Detalle_Venta(
	idVenta int NOT NULL,
	idProducto int NOT NULL,
	Cantidad int NOT NULL,
	constraint fk_idVenta foreign key(idVenta) references venta(idVenta),
	constraint fk_idProducto foreign key(idProducto) references producto(idProducto)
);










MySql

Usuario de (Perú)

Hola Santos, lo que yo puedo ver es que en tu tabla Detalle_Venta falta definir el primary key; ese no será el problema que tienes?

  • 2016-10-26 23:02:54
  • Me gusta(0)
Usuario de (Perú)

Lo mismo pasa con Detalle_Compra falta definir el primary key.

  • 2016-10-26 23:04:46
  • Me gusta(0)
Usuario de (No especificado)

Esta relacionada con la tabla Venta y Compra, son como tablas hijas, o puedo borrar esas tablas 'Detalle_...' y agregar los atributos que tenia a la tabla compra y venta?

  • 2016-10-27 00:07:37
  • Me gusta(0)
Usuario de (Perú)

Por mucho que sea tablas hijas deben tener sus llaves primarias para que puedas identificarlas.

  • 2016-10-27 10:36:21
  • Me gusta(0)
Usuario de (No especificado)

Entonces agregando su IdDetalleCompra y IdDetalleVenta se arreglara ese problema?

  • 2016-10-27 21:21:24
  • Me gusta(0)
Usuario de (Perú)

En realidad el error es por el nombre de la restricción que estás asignando fk_idProducto en ambos casos... debería asignar un nombre de restricción "constraint" diferente para cada caso... pero tampoco entiendo por qué haces eso ya que puedes dejar que por defecto asigne el motor, es decir.

En vez que hagas esto:

CREATE TABLE Detalle_Venta(
	idVenta int NOT NULL,
	idProducto int NOT NULL,
	Cantidad int NOT NULL,
	constraint fk_idVenta foreign key(idVenta) references venta(idVenta),
	constraint fk_idProducto foreign key(idProducto) references producto(idProducto)
);

podrías hacerlo simplemente así:

CREATE TABLE Detalle_Venta(
    idDetalleVenta int auto_increment not null,
	idVenta int NOT NULL,
	idProducto int NOT NULL,
	Cantidad int NOT NULL,
	foreign key(idVenta) references venta(idVenta),
	foreign key(idProducto) references producto(idProducto),
    primary key(idDetalleVenta)
);

muy fuera del primary key que estoy añadiendo para corregir lo que te hace falta, fíjate las llaves; no tienen el "constraint" definido y de esa manera los nombres de las restricción como llaves foráneas se asignan de forma automática.

Espero te sirva esta explicación.

Saludos.

  • 2016-10-27 21:33:28
  • Me gusta(0)

  • Debes estar logueado para realizar comentarios