mysql - transact - unique constraint oracle
¿Puedo usar VARCHAR como PRIMARY KEY? (5)
Depende del caso de uso específico.
Si su tabla es estática y solo tiene una lista corta de valores (y existe una pequeña posibilidad de que esto cambie durante toda la vida de la base de datos), recomendaría esta construcción:
CREATE TABLE Foo
(
FooCode VARCHAR(16), -- short code or shortcut, but with some meaning.
Name NVARCHAR(128), -- full name of entity, can be used as fallback in case when your localization for some language doesn''t exist
LocalizationCode AS (''Foo.'' + FooCode) -- This could be a code for your localization table...
)
Por supuesto, cuando su tabla no es estática, usar INT como clave principal es la mejor solución.
Tengo una tabla para almacenar cupones / descuentos, y quiero usar la columna coupon_code como la clave principal, que es un VARCHAR
.
Mi razonamiento es que cada cupón tendrá un código único y los únicos comandos que ejecutaré son SELECT ... FROM ... WHERE coupon_code=''..''
No haré ninguna unión o indexación, y no veo que haya más de unas pocas entradas en esta tabla.
Me parece que esto estará bien, pero no sé si me estoy perdiendo algo o no estoy pensando en eso.
Está bien seguro. Con solo unos pocos cientos de entradas, será rápido.
Puede agregar una identificación única como clave principal (int autoincrement) y establecer su coupon_code como único. Entonces, si necesita hacer una solicitud en otras tablas, es mejor usar int que varchar
Por supuesto que puede, en el sentido de que su RDBMS le permitirá hacerlo. Sin embargo, la respuesta a la pregunta de si debe hacerlo o no es diferente: en la mayoría de las situaciones, los valores que tienen un significado fuera del sistema de su base de datos no se deben elegir como clave principal.
Si sabe que el valor es único en el sistema que está modelando, es apropiado agregar un índice único o una restricción única a su tabla. Sin embargo, su clave principal generalmente debe ser un valor "sin sentido", como un número autoincrementado o un GUID.
La razón de esto es simple: ocurren errores de entrada de datos y cambios infrecuentes a cosas que parecen no intercambiables. Se vuelven mucho más difíciles de corregir en los valores que se utilizan como claves principales.
Una manta "no, no deberías" es un consejo terrible. Esto es perfectamente razonable en muchas situaciones dependiendo de su caso de uso, carga de trabajo, entropía de datos, hardware, etc. Lo que no debe hacer es hacer suposiciones.
Cabe señalar que puede especificar un prefijo que limitará la indexación de MySQL, lo que le ayudará a reducir los resultados antes de escanear el resto. Sin embargo, esto puede ser cada vez menos útil a medida que su prefijo se "llena" y se vuelve menos único.
Es muy simple de hacer, por ejemplo:
CREATE TABLE IF NOT EXISTS `foo` (
`id` varchar(128),
PRIMARY KEY (`id`(4)),
)
También tenga en cuenta que el prefijo (4)
aparece después de las comillas de la columna.
Por último, debe leer cómo funcionan los prefijos de índice y sus limitaciones antes de usarlos:
preferiría utilizar Unique en lugar de Primary key en este contexto, para evitar el error de entrada de datos o podría utilizarse para actualizar el código coupen, etc.