Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Evitar AUTOINCREMENT

Estas en el tema de Evitar AUTOINCREMENT en el foro de Mysql en Foros del Web. Tengo una tabla en MySQL con un campo marcado con AUTOINCREMENT. Lo que quiero es que si a este campo le quiero meter yo el ...
  #1 (permalink)  
Antiguo 28/05/2012, 08:15
 
Fecha de Ingreso: abril-2011
Ubicación: Motril
Mensajes: 49
Antigüedad: 13 años, 7 meses
Puntos: 1
Pregunta Evitar AUTOINCREMENT

Tengo una tabla en MySQL con un campo marcado con AUTOINCREMENT. Lo que quiero es que si a este campo le quiero meter yo el valor a mano, y no usar el autoincremento me reemplaza mi valor por el que toque por autoincremento.

¿Hay forma de evitar esto? Lo unico que he conseguido ha sido actualizar el campo despues de insertar para poner el valor que deseo.
  #2 (permalink)  
Antiguo 28/05/2012, 09:11
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Evitar AUTOINCREMENT

Hola anrodse:

Tu puedes enviar en cualquier momento el ID que quieres colocar... si no envías el parámetro entonces se genera de manera automática. Observa este script:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (id INT AUTO_INCREMENT,
  2.   -> descripcion VARCHAR(10), PRIMARY KEY (id));
  3. Query OK, 0 rows affected (0.09 sec)
  4.  
  5. mysql> #ENVIANDO NULL
  6. mysql> INSERT INTO tabla VALUES (NULL, 'uno');
  7. Query OK, 1 row affected (0.03 sec)
  8.  
  9. mysql> SELECT * FROM tabla;
  10. +----+-------------+
  11. | id | descripcion |
  12. +----+-------------+
  13. |  1 | uno         |
  14. +----+-------------+
  15. 1 row in set (0.00 sec)
  16.  
  17. mysql> #ENVIANDO SOLO LOS CAMPOS NECESARIOS
  18. mysql> INSERT INTO tabla (descripcion) VALUES ('dos');
  19. Query OK, 1 row affected (0.05 sec)
  20.  
  21. mysql> SELECT * FROM tabla;
  22. +----+-------------+
  23. | id | descripcion |
  24. +----+-------------+
  25. |  1 | uno         |
  26. |  2 | dos         |
  27. +----+-------------+
  28. 2 rows in set (0.00 sec)
  29.  
  30. mysql> #ASIGNANDO EL ID DE MANERA DIRECTA
  31. mysql> INSERT INTO tabla VALUES (4, 'tres');
  32. Query OK, 1 row affected (0.01 sec)
  33.  
  34. mysql> SELECT * FROM tabla;
  35. +----+-------------+
  36. | id | descripcion |
  37. +----+-------------+
  38. |  1 | uno         |
  39. |  2 | dos         |
  40. |  4 | tres        |
  41. +----+-------------+
  42. 3 rows in set (0.00 sec)

Observa que en los dos primeros casos no se envía un valor para el campo ID, por lo tanto se asigna de manera automática. En el tercer caso SI SE ENVÍA UN VALOR DE ID DIRECTO, Sin embargo creo que te puedes dar cuenta del riesgo que corres al hacerlo de esta manera:

Código MySQL:
Ver original
  1. mysql> INSERT INTO tabla VALUES (4, 'cuatro');
  2. ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY'
  3. mysql> SELECT * FROM tabla;
  4. +----+-------------+
  5. | id | descripcion |
  6. +----+-------------+
  7. |  1 | uno         |
  8. |  2 | dos         |
  9. |  4 | tres        |
  10. +----+-------------+
  11. 3 rows in set (0.00 sec)

Si el id que quieres asignar YA EXISTE en la tabla entonces tendrás un error de llave duplicada. Aquí se hace entonces necesario que nos dijeras ¿QUÉ UTILIDAD LE VEZ EN ASIGNAR LA LLAVE DE MANERA DIRECTA Y NO DE MANERA AUTOMÁTICA?.

Espero sinceramente que no me vayas a decir que para evitar "saltos" en los id's cuando se elimina alguna entrada .

Saludos
Leo.
  #3 (permalink)  
Antiguo 28/05/2012, 09:45
 
Fecha de Ingreso: abril-2011
Ubicación: Motril
Mensajes: 49
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Evitar AUTOINCREMENT

Lo siento, pero no me funciona y no se porque. Mis tablas son estas:
Código:
CREATE TABLE Colaborador (
	  OID INTEGER PRIMARY KEY AUTO_INCREMENT
	, Direccion VARCHAR (50) NOT NULL
	, Localidad VARCHAR (50) NOT NULL
	, Provincia VARCHAR (50) NOT NULL
	, CP VARCHAR (5) NOT NULL
	, telefonoFijo VARCHAR (15)
	, telefonoMovil VARCHAR (15)
	, Email VARCHAR(50)
);

CREATE TABLE C_Persona (
	  OID INTEGER
	, DNI VARCHAR (9) NOT NULL UNIQUE
	, Nombre VARCHAR (50) NOT NULL
	, Apellidos VARCHAR (256) NOT NULL
	, FechaNacimiento DATE NOT NULL
	, Sexo CHAR
	, PRIMARY KEY (OID)
	, CONSTRAINT Fk_OIDCPersona FOREIGN KEY (OID)
				REFERENCES Colaborador (OID)
);
y estas mis insercciones:

Código:
INSERT INTO Colaborador VALUES (0,'Sin dirección', '', '', '00000', '', '', '');
INSERT INTO C_Persona VALUES (0, '00000000a', 'Anónimo', '', '0001-01-01', 'M');
Cuando lo hago no me funciona. Me da error
INSERT INTO C_Persona VALUES ( 0, '00000000a', 'Anónimo', '', '0001-01-01', 'M' );

MySQL ha dicho: Documentación
#1452 - Cannot add or update a child row: a foreign key constraint fails (`diaketas`.`c_persona`, CONSTRAINT `Fk_OIDCPersona` FOREIGN KEY (`OID`) REFERENCES `colaborador` (`OID`))

Si miro la tabla Colaborador el OID no esta a cero a pesar de que se lo he indicado.

P.D: No, tranquilo, no quiero hacer nada extraño como no dejar IDs perdidos o cosas asi. jejje
Solo quiero tener un colaborador anonimo con ID = 0 siempre, y el AUTOINCREMENT ademas de empezar a contar por 1, si meto una y la borro la siguiente no sera 1.
  #4 (permalink)  
Antiguo 28/05/2012, 10:21
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Evitar AUTOINCREMENT

Hola de nuevo:

Mucho ojo, NO PUEDES COLOCAR UN CAMPO AUTO_INCREMENTAL COMO CERO (0)... debe ser un número mayor o igual a 1. Es por eso que aunque el insert no marca error NO LE ASIGNA EL VALOR DE CERO.... puede probar con cualquier otro valor positivo y el insert se hará de manera correcta:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE Colaborador (
  2.     -> Direccion VARCHAR (50) NOT NULL,
  3.     -> Localidad VARCHAR (50) NOT NULL,
  4.     -> Provincia VARCHAR (50) NOT NULL,
  5.     -> CP VARCHAR (5) NOT NULL,
  6.     -> telefonoFijo VARCHAR (15),
  7.     -> telefonoMovil VARCHAR (15),
  8.     -> Email VARCHAR(50));
  9. Query OK, 0 rows affected (0.07 sec)
  10.  
  11. mysql> CREATE TABLE C_Persona (
  12.     -> OID INTEGER,
  13.     -> DNI VARCHAR (9) NOT NULL UNIQUE,
  14.     -> Nombre VARCHAR (50) NOT NULL,
  15.     -> Apellidos VARCHAR (256) NOT NULL,
  16.     -> FechaNacimiento DATE NOT NULL,
  17.     -> Sexo CHAR,
  18.     -> PRIMARY KEY (OID),
  19.     -> CONSTRAINT Fk_OIDCPersona FOREIGN KEY (OID)
  20.     -> REFERENCES Colaborador (OID));
  21. Query OK, 0 rows affected (0.09 sec)
  22.  
  23. mysql> INSERT INTO Colaborador  VALUES
  24.     -> (99,'Sin direccion', '', '', '00000', '', '', '');
  25. Query OK, 1 row affected (0.03 sec)
  26.  
  27. mysql> SELECT OID, Direccion, CP FROM Colaborador;
  28. +-----+---------------+-------+
  29. | OID | Direccion     | CP    |
  30. +-----+---------------+-------+
  31. |  99 | Sin direccion | 00000 |
  32. +-----+---------------+-------+
  33. 1 row in set (0.00 sec)
  34.  
  35. mysql> INSERT INTO C_Persona VALUES (99, '00000000a', 'Anonimo', '',
  36.     -> '0001-01-01', 'M');
  37. Query OK, 1 row affected (0.03 sec)
  38.  
  39. mysql> select * from c_persona;
  40. +-----+-----------+---------+-----------+-----------------+------+
  41. | OID | DNI       | Nombre  | Apellidos | FechaNacimiento | Sexo |
  42. +-----+-----------+---------+-----------+-----------------+------+
  43. |  99 | 00000000a | Anonimo |           | 0001-01-01      | M    |
  44. +-----+-----------+---------+-----------+-----------------+------+
  45. 1 row in set (0.00 sec)

Saludos
Leo.

Etiquetas: obviar, autoincrementable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:05.