SQL - Como Evitar un Registro Duplicado

 
Vista:

Como Evitar un Registro Duplicado

Publicado por JHONATAN IVAN (5 intervenciones) el 06/07/2016 14:32:58
Hola muy buenos dias estimados amigos de la comunidad he diseñado una db para poder almacenar numeros de ordenes de trabajos entregadas por mis clientes, el problema que tengo es el siguiente:

Aveces los clientes repiten las ordenes de trabajo mas de una vez y necesito que al ingresar el registro en la db el sistema primero compruebe que ese cliente no tiene esa orden ya en transito como puedo hacer.

Ejemplo:

Orden ---- Cliente
7521 ---- Pedro Perez
4723 ---- Jose Ortega
7521 ---- Pedro Perez

Quiero evitar esa duplicidad en sql hay forma de hacerlo?.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Como Evitar un Registro Duplicado

Publicado por leonardo_josue (1173 intervenciones) el 06/07/2016 15:50:20
Hola Jhonatan:

¿Con qué BD's estás trabajando? dependiendo de esto, la solución puede variar.

Lo más simple es que pongas una restricción de tipo UNIQUE en tu tabla, o que pongas los campos ORDEN y CLIENTE como llave principal de tu tabla, de esta manera NO PODRÁS INTRODUCIR REGISTROS DUPLICADOS.

Pregúntale a SAN GOOGLE si tienes dudas sobre estos temas, estoy seguro que él te dará la respuesta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como Evitar un Registro Duplicado

Publicado por JHONATAN IVAN (5 intervenciones) el 06/07/2016 18:00:42
Con sql server 2008 r2 lo que esto buscando es lo siguiente

que sql compruebe si el usuario pedro perez tiene la orden 7221 registrada primero si esta advierte que existe y no la registre de lo contrario ingresa el registro tranquilamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Como Evitar un Registro Duplicado

Publicado por leonardo_josue (1173 intervenciones) el 06/07/2016 19:05:03
Hola de nuevo Jhonatan:

Creo que te estás complicando de más, cuando los DBMS's ya hacen esa validación de manera automática. Cuando tú declaras una llave compuesta o una restricción UNIQUE, al tratar de hacer una inserción o una actualización, el motor verifica primero que el registro no esté duplicado, y si es así, entonces marca error. Checa este ejemplo en MySQL que aplica también a SQL Server:

Primero creamos una tabla con los campos que mencionas y declaramos una llave primara compuesta por ambos campos:

1
2
3
4
5
6
mysql> CREATE TABLE tabla (
    ->   orden INT,
    ->   cliente VARCHAR(30),
    ->   PRIMARY KEY (orden, cliente)
    -> );
Query OK, 0 rows affected (0.29 sec)

Enseguida hacemos los dos INSERT's y verificamos que se hayan hecho correctamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> INSERT INTO tabla VALUES (7521, 'Pedro Perez');
Query OK, 1 row affected (0.10 sec)
 
mysql> INSERT INTO tabla VALUES (4723, 'Jose Ortega');
Query OK, 1 row affected (0.14 sec)
 
mysql> SELECT * FROM tabla;
+-------+-------------+
| orden | cliente     |
+-------+-------------+
|  4723 | Jose Ortega |
|  7521 | Pedro Perez |
+-------+-------------+
2 rows in set (0.00 sec)

Ahora bien, si tratamos de insertar un registro que ya existe, entonces el motor marca una violación de llave primaria duplicada Y NO INSERTA EL REGISTRO

1
2
3
4
5
6
7
8
9
10
11
mysql> INSERT INTO tabla VALUES (7521, 'Pedro Perez');
ERROR 1062 (23000): Duplicate entry '7521-Pedro Perez' for key 'PRIMARY'
 
mysql> SELECT * FROM tabla;
+-------+-------------+
| orden | cliente     |
+-------+-------------+
|  4723 | Jose Ortega |
|  7521 | Pedro Perez |
+-------+-------------+
2 rows in set (0.00 sec)

Esto es exactamente lo que necesitas no?

Saludos
Leo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como Evitar un Registro Duplicado

Publicado por JHONATAN IVAN (5 intervenciones) el 06/07/2016 23:12:09
El código de mi tabla es exactamente este

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
USE [sistema]
GO
/****** Object:  Table [dbo].[ORDENES]    Script Date: 07/06/2016 17:03:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ORDENES](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[CODIGO] [varchar](255) NOT NULL,
	[RAZONSOCIAL] [varchar](255) NOT NULL,
	[RIF] [varchar](255) NOT NULL,
	[DIRECCION] [varchar](255) NULL,
	[TELEFONO] [varchar](255) NULL,
	[NRODENOTADEENTREGA] [varchar](255) NULL,
	[FECHANOTADEENTREGA] [date] NULL,
	[FECHAORDERN] [date] NULL,
	[C01] [varchar](8) NULL,
	[C02] [varchar](7) NULL,
	[C03] [varchar](7) NULL,
	[C04] [varchar](7) NULL,
	[C05] [varchar](7) NULL,
	[C06] [varchar](7) NULL,
	[C07] [varchar](7) NULL,
	[C08] [varchar](7) NULL,
	[C09] [varchar](7) NULL,
	[C10] [varchar](7) NULL,
	[C11] [varchar](7) NULL,
	[C12] [varchar](7) NULL,
	[C13] [varchar](7) NULL,
	[C14] [varchar](7) NULL,
	[OBSERVACIONES] [varchar](255) NULL,
	[ESTADO] [varchar](255) NULL,
	[LABORATORIO] [varchar](255) NULL,
	[CERRADA] [varchar](255) NULL,
	[ORDENDELCLIENTE] [varchar](255) NOT NULL,
	[ENLABORATORIO] [varchar](255) NULL,
	[ENTREGADA] [varchar](255) NULL,
	[PORENTREGAR] [varchar](255) NULL,
	[CAJA] [varchar](255) NULL,
 CONSTRAINT [PK__ORDENES__3214EC27060DEAE8] PRIMARY KEY CLUSTERED
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Default [DF__ORDENES__FECHAOR__108B795B]    Script Date: 07/06/2016 17:03:53 ******/
ALTER TABLE [dbo].[ORDENES] ADD  CONSTRAINT [DF__ORDENES__FECHAOR__108B795B]  DEFAULT (getdate()) FOR [FECHAORDERN]
GO
/****** Object:  Default [DF__ORDENES__ESTADO__117F9D94]    Script Date: 07/06/2016 17:03:53 ******/
ALTER TABLE [dbo].[ORDENES] ADD  CONSTRAINT [DF__ORDENES__ESTADO__117F9D94]  DEFAULT ('Sin estado') FOR [ESTADO]
GO
/****** Object:  Default [DF_ORDENES_CERRADA]    Script Date: 07/06/2016 17:03:53 ******/
ALTER TABLE [dbo].[ORDENES] ADD  CONSTRAINT [DF_ORDENES_CERRADA]  DEFAULT ('No') FOR [CERRADA]
GO
/****** Object:  Default [DF_ORDENES_ENTREGADA]    Script Date: 07/06/2016 17:03:53 ******/
ALTER TABLE [dbo].[ORDENES] ADD  CONSTRAINT [DF_ORDENES_ENTREGADA]  DEFAULT ('No') FOR [ENTREGADA]
GO
/****** Object:  Default [DF_ORDENES_PORENTREGAR]    Script Date: 07/06/2016 17:03:53 ******/
ALTER TABLE [dbo].[ORDENES] ADD  CONSTRAINT [DF_ORDENES_PORENTREGAR]  DEFAULT ('Si') FOR [PORENTREGAR]
GO


con este codigo lo que necesito es que cuando el registro este por introducirse se haga una consulta en donde por ejemplo diga algo como esto


Si
[CODIGO] [varchar](255) NOT NULL,
tinene registrado
[ORDENDELCLIENTE] [varchar](255) NOT NULL,
entonces arroja mensaje de error
de lo contrario inserta registro
[CODIGO] [varchar](255) NOT NULL,
[ORDENDELCLIENTE] [varchar](255) NOT NULL, esta numeracion de este campo no es manual la asigna el cliente por lo tanto muchos clientes pueden tener un formato del 1 al 10 con un numero de correlativo X lo que quiero es evitar que el cliente traiga dos veces el mismo formato.

ejemplo correcto

+-------+-------+-------------+

ID | orden | cliente |

+-------+-------+-------------+

1 | 4723 | Jose Ortega |

2 | 7521 | Pedro Perez |

3 | 4723 | Pedro Perez|

? | 4723 | Pedro Perez| Registro duplicado que no debe incluirse

+-------+-------------+
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Como Evitar un Registro Duplicado

Publicado por leonardo_josue (1173 intervenciones) el 06/07/2016 23:38:40
Compañero,

haz buscado en google algo de lo que te he venido mencionado en mis posts???

haz investigado cómo se hacen SP, Triggers y Transacciones???

porque tal pareciera que no, y que estás esperando que te demos exactamente la solución a tu problema... ojo con eso.

Checa esta liga

http://lmgtfy.com/?q=constraint+unique+sql+server+2008

Esto creo que te puede servir para tu problema y muchos problemas futuros.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como Evitar un Registro Duplicado

Publicado por JHONATAN IVAN (5 intervenciones) el 06/07/2016 23:42:51
Hola compañero no para nada es que ni siquiera se por donde comenzar a buscar le e preguntado a google pero sin saber exactamente que es lo que busco solo me monte en esto y no sabia si lo que tenia era que correr un Triggers o que!, es que de sqlserver no conozco mucho mucho pero gracias por tu aporte lo checo y te aviso como me fue.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Como Evitar un Registro Duplicado

Publicado por Isaias (1921 intervenciones) el 07/07/2016 21:44:48
Si NO sabes en donde buscar y mucho menos SABES que buscar, pues esta dificil tu posicion.

Si vas a Google y le preguntas

SQL SERVER 2008 Como evito registros duplicados

Te mostrara un sin fin de respuestas.......
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2
Ha aumentado su posición en 32 puestos en SQL (en relación al último mes)
Gráfica de SQL

Como Evitar un Registro Duplicado

Publicado por jesus (1 intervención) el 16/05/2018 22:53:34
Set rs4 = cn.Execute("INSERT INTO productos SELECT * FROM prodpaso WHERE codigo5,almacen5 NOT in (SELECT codigo,almacen FROM productos)")

alguna ayuda para este codigo ..
pretendo insertar una seria de datos en la tabla productos, de la tabla prodpaso, obio sin q inseerte los que ya estan en productos.
ambas tablas tienen la primary key codigo,almacen

alguna ayuda¡?¿'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar