Primaire sleutels (MySQL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
 
(11 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 1: Regel 1:
In MySQL kun je een tabel pas behoorlijk manipuleren als-ie een ''primaire sleutel'' of ''primary key'' heeft. Daarnaast heeft MySQL Workbench een bug waardoor-ie zich soms verslikt in tabellen zonder primaire slutel.
+
In MySQL kun je een tabel pas behoorlijk manipuleren als-ie een ''primaire sleutel'' of ''primary key'' heeft. Daarnaast heeft MySQL Workbench een bug waardoor-ie zich soms verslikt in tabellen zonder primaire sleutel.
  
== Nieuwe pk-kolom toevoegen ==
+
Daarnaast wil ik soms een kolom met 'volgnummers' van records toevoegen aan een bestaande tabel, omdat MySQL van zichzelf geen betrouwbare nummering van records kent.
  
Gelukkig kun je primaire sleutels gemakkelijk toevoegen én gelijk invullen:
+
== PK's - Inleiding ==
 +
 
 +
* Een tabel kan maar één primaire sleutel hebben. Deze kolom mag niet leeg zijn
 +
* Een samengestelde sleutel geldt ook als één primaire sleutel.
 +
 
 +
== PK defineren bij aanmaken van tabel ==
 +
 
 +
Simpel:
 +
 
 +
<pre>
 +
drop table if exists access_number_tmp;
 +
 
 +
create table access_number_tmp
 +
(
 +
    destination_en varchar(255),
 +
    destination_nl varchar(255),
 +
    destination_es varchar(255),
 +
    territory_en varchar(255),
 +
    territory_nl varchar(255),
 +
    territory_es varchar(255),
 +
    slug_territory_nl varchar(255), # For constructing hyperlinks
 +
    slug_territory_en varchar(255), # For constructing hyperlinks
 +
    slug_territory_es varchar(255), # For constructing hyperlinks
 +
    access_number varchar(40),
 +
    price_per_minute_txt_period_raw varchar(40), # Can have more figures behind decimal separation symbol
 +
    price_per_minute_decimal decimal(5,2), # 3 Cijfers vóór decimaalscheidingsteken, 2 erna
 +
    price_per_minute_txt_period_euro_symbol varchar(40),   
 +
    price_per_minute_txt_comma_euro_symbol varchar(40),
 +
    table_row_html_nl text,
 +
    table_row_html_en text,
 +
    table_row_html_es text,
 +
   
 +
    primary key (destination_en)
 +
);
 +
</pre>
 +
 
 +
== pk-veld naderhand toevoegen ==
 +
 
 +
Gelukkig kun je primaire sleutels gemakkelijk later toevoegen én gelijk invullen:
  
 
  ALTER TABLE tbl_tabelnaam ADD pk INT PRIMARY KEY AUTO_INCREMENT;
 
  ALTER TABLE tbl_tabelnaam ADD pk INT PRIMARY KEY AUTO_INCREMENT;
Regel 13: Regel 51:
 
  alter table tbl_main_tool add primary key (pk);
 
  alter table tbl_main_tool add primary key (pk);
  
== Composite primary key ==
+
== Samengestelde primaire sleutel ==
  
Fluitje van een cent:
+
''Samengestelde primaire sleutel'' aka. ''composite primary key'' is een fluitje van een cent. Bv.:
  
Bv.:
+
<pre>
 +
create table device_sku_int
 +
(
 +
    brand varchar(255), # Device brand, e.g. Bosch
 +
    device_type varchar(255), # Machinereferentie, e.g. 10GM/P
 +
    device_sku varchar(255), # Device SKU, assigned by brand
 +
    device_kind_nl varchar(255), # E.g. "Boormachine"
 +
    device_voltage varchar(40),
 +
    device_other varchar(255),
 +
    device_kind varchar(40),
 +
    device_lang varchar(40),
 +
    sku varchar(255),
 +
    cat varchar(255), # Just a field from source tables (March 2020)
 +
    note text, # Just a field from source tables (March 2020)
 +
   
 +
    # Primary key
 +
    ##############################################
 +
    #
 +
    # * Originally (bal_dwh_op.sq_device_sku_import) the primary key was (brand, device_type),
 +
    #  which resulted in 23.918 records (March 13, 2020)
 +
    #  That's fine if you only want to know the devices, but not fine if you want to know
 +
    #  all combinations of devices + skus - Which is the purpose of this sproc/table.
 +
    # * With primary key (brand, device_type, sku), there are 32.031 records (March 13,
 +
    #  2020)
 +
    # * There are situations without device_type, but with device_sku → Make it a
 +
    #  PK with four fields
 +
    # * With primary key (brand, device_type, device_sku, sku), there are 32.233 records
 +
    #  (March 2020) - Not much of a difference
 +
    #
 +
    primary key(brand, device_type, device_sku, sku),
  
<pre>
+
);</pre>
CREATE TABLE INFO (
 
    t1ID INT,
 
    t2ID INT,
 
    PRIMARY KEY (t1ID, t2ID)
 
)
 
</pre>
 
  
 
of
 
of
Regel 33: Regel 94:
 
add primary key (tool_id, sku);
 
add primary key (tool_id, sku);
 
</pre>
 
</pre>
 +
 +
== Zie ook ==
 +
 +
* [[Foreign keys (MySQL)]]
  
 
== Bronnen ==
 
== Bronnen ==
  
 
* http://stackoverflow.com/questions/5835978/how-to-properly-create-composite-primary-keys-mysql
 
* http://stackoverflow.com/questions/5835978/how-to-properly-create-composite-primary-keys-mysql
 +
* http://www.mysqltutorial.org/mysql-foreign-key/

Huidige versie van 13 mrt 2020 om 14:56

In MySQL kun je een tabel pas behoorlijk manipuleren als-ie een primaire sleutel of primary key heeft. Daarnaast heeft MySQL Workbench een bug waardoor-ie zich soms verslikt in tabellen zonder primaire sleutel.

Daarnaast wil ik soms een kolom met 'volgnummers' van records toevoegen aan een bestaande tabel, omdat MySQL van zichzelf geen betrouwbare nummering van records kent.

PK's - Inleiding

  • Een tabel kan maar één primaire sleutel hebben. Deze kolom mag niet leeg zijn
  • Een samengestelde sleutel geldt ook als één primaire sleutel.

PK defineren bij aanmaken van tabel

Simpel:

drop table if exists access_number_tmp;

create table access_number_tmp
(
    destination_en				varchar(255),
    destination_nl				varchar(255),
    destination_es				varchar(255),
    territory_en				varchar(255),
    territory_nl				varchar(255),
    territory_es				varchar(255),
    slug_territory_nl				varchar(255),	# For constructing hyperlinks
    slug_territory_en				varchar(255),	# For constructing hyperlinks
    slug_territory_es				varchar(255),	# For constructing hyperlinks
    access_number				varchar(40),
    price_per_minute_txt_period_raw		varchar(40),	# Can have more figures behind decimal separation symbol
    price_per_minute_decimal			decimal(5,2),	# 3 Cijfers vóór decimaalscheidingsteken, 2 erna
    price_per_minute_txt_period_euro_symbol	varchar(40),    
    price_per_minute_txt_comma_euro_symbol	varchar(40),
    table_row_html_nl				text,
    table_row_html_en				text,
    table_row_html_es				text,
    
    primary key (destination_en)
);

pk-veld naderhand toevoegen

Gelukkig kun je primaire sleutels gemakkelijk later toevoegen én gelijk invullen:

ALTER TABLE tbl_tabelnaam ADD pk INT PRIMARY KEY AUTO_INCREMENT;

Als zo'n pk geen 'echt' veld, maar puur is toegevoegd om als sleutel te dienen, noem ik 'm pk.

Bestaande kolom pk maken

alter table tbl_main_tool add primary key (pk);

Samengestelde primaire sleutel

Samengestelde primaire sleutel aka. composite primary key is een fluitje van een cent. Bv.:

create table device_sku_int
(
    brand		varchar(255),	# Device brand, e.g. Bosch
    device_type		varchar(255),	# Machinereferentie, e.g. 10GM/P
    device_sku		varchar(255),	# Device SKU, assigned by brand 
    device_kind_nl	varchar(255),	# E.g. "Boormachine"
    device_voltage	varchar(40),
    device_other	varchar(255),
    device_kind		varchar(40),
    device_lang		varchar(40),
    sku			varchar(255),
    cat			varchar(255),	# Just a field from source tables (March 2020)
    note		text,		# Just a field from source tables (March 2020) 
    
    # Primary key
    ##############################################
    #
    # * Originally (bal_dwh_op.sq_device_sku_import) the primary key was (brand, device_type),
    #   which resulted in 23.918 records (March 13, 2020)
    #   That's fine if you only want to know the devices, but not fine if you want to know
    #   all combinations of devices + skus - Which is the purpose of this sproc/table.
    # * With primary key (brand, device_type, sku), there are 32.031 records (March 13,
    #   2020)
    # * There are situations without device_type, but with device_sku → Make it a
    #   PK with four fields 
    # * With primary key (brand, device_type, device_sku, sku), there are 32.233 records
    #   (March 2020) - Not much of a difference
    #
    primary key(brand, device_type, device_sku, sku),

);

of

alter table brush_tool
add primary key (tool_id, sku);

Zie ook

Bronnen