2008-11-09 5 views
0

날짜를 텍스트로 나타내는 테이블 (예 : "2008-11-09")이 데이터베이스에 있으며이를 UNIX 타임 스탬프로 바꾸고 싶습니다. 그러나, MySQL 자체가 변환을 수행 할 수 있다고 생각하지 않습니다, 그래서 변환을 할 약간의 스크립트를 작성하고 싶습니다. 내가 생각하는 방식은 테이블의 모든 레코드를 가져 와서 반복하고 데이터베이스 레코드를 업데이트하는 것입니다. 그러나 기본 키가 없으면 업데이트해야하는 정확한 레코드를 쉽게 얻을 수 없습니다.기본 키가없는 테이블의 각 레코드를 변경 하시겠습니까?

SELECT를하는 동안 레코드에 임시 ID를 할당하여 업데이트 할 때 다시 참조 할 수있는 방법이 있습니까?

답변

5

그렇지 않습니다.

UPDATE 
    MyTable 
SET 
    MyTimeStamp = UNIX_TIMESTAMP(MyDateTime); 
+0

참고 참조 : MySQL은 그것을 할 수없는 가정 전에 뭔가를 할 수 있는지 확인합니다. 감사. –

+0

가끔은 나무가 보이지 않습니다. 내가 너를 잡을 수있는 다른 것, 선생님? :-D – Tomalak

+0

P .: 일광 절약 시간 문제에주의하십시오. 기본 데이터에서 허용하는 경우 datetime을 UTC로 먼저 변환하십시오. – Tomalak

1

당신은 반복해야합니까 어떤 이유로, 내가 할 수있는 두 가지 방법으로 생각할 수 있습니다 (이 특정 MySQL을하지 않습니다) (다른 답변은하지 않는 상황 포함)하는 경우 :

  1. 자동 할당 번호 인 테이블에 열을 추가하십시오. 이를 업데이트 용 PK로 사용하고, 이후에 열을 삭제하십시오 (또는 향후 사용을 위해 보관하십시오).

  2. 정의 된 PK가없는 테이블에서 정확한 중복 행이없는 한 전체 행을 복합 PK로 사용할 수 있습니다. 행의 모든 ​​열을 구별되는 특성으로 사용하십시오. 즉, 테이블에 "name", "address"및 "updated"열이 있으면 다음을 수행하십시오.

    UPDATE mytable SET updated = [timestamp value] WHERE name = [name] AND address = [address ] AND timestamp = [old timestamp]

많은 데이터 액세스 프레임 워크는 낙관적 동시성을 구현하기 위해이 정확한 전략을 사용합니다.

1

아니요, 단일 업데이트 문으로이 작업을 수행 할 수 있어야합니다. 모든 날짜가 yyyy-mm-dd이고 DATETIME 대신에 일종의 텍스트 열에 저장되는 경우 데이터를 이동할 수 있습니다. SQL은 다음과 같을 것입니다 :

ALTER TABLE t ADD COLUMN dates DATETIME; 
UPDATE t set t.dates=t.olddate; 

이것은 MySQL이 테이블의 각 행을 스캔 할 수 있기 때문에 PK에 의존해서는 안됩니다. PK가 문제가되는 유일한 경우는 단일 행을 업데이트해야하지만 행이 고유하지 않을 수 있습니다.

1

당신은 변수 기능은 MySQL 사용자를 사용하여 SELECT 동안 값을 생성 할 수 있지만,이 값은 행을 참조하지 않는다; 결과 집합의 임시 부분 일뿐입니다. UPDATE 문에는 사용할 수 없습니다.

SET @v := 0; 
SELECT @v:[email protected]+1, * FROM mytable; 

다음은이 문제를 해결하는 방법입니다. 어쨌든 UNIX 타임 스탬프에 대한 다른 열을 만들어야하므로 먼저 추가 할 수 있습니다. 그런 다음 이전 datetime 열의 값을 UNIX 타임 스탬프로 변환하고 새 열에 배치합니다. 그런 다음 이전 텍스트 datetime 열을 삭제하십시오.

ALTER TABLE mytable ADD COLUMN unix_timestamp INT UNSIGNED NOT NULL DEFAULT 0; 

UPDATE mytable 
SET unix_timestamp = UNIX_TIMESTAMP(STR_TO_DATE(text_timestamp, '%Y-%m-%d')); 

ALTER TABLE mytable DROP COLUMN text_timestamp; 

물론 이전 열을 삭제하기 전에 변환이 올바르게 완료되었는지 확인해야합니다.

자체에 UNIX_TIMESTAMP()STR_TO_DATE()

관련 문제